找回密码
 立即注册

QQ登录

只需一步,快速开始

dapsjj
初级会员   /  发表于:2016-11-7 08:47  /   查看:7255  /  回复:12
本帖最后由 dapsjj 于 2016-11-7 09:00 编辑

重写 SelectionRenderer后选中spread的一行,不生效,请问哪里有问题?想让鼠标左键选中spread的一行后,这行数据变为蓝色,代码如下,但是发现选中一行后没有反应,背景没有变为蓝色?请问哪里不对?我选中了下图红框中的的数据,但是背景没有变色。33,34行。213-221行是变背景色的代码。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Runtime.Remoting.Messaging;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using MY.BLL;
  12. using MY.Common;

  13. namespace PcSystemMain
  14. {
  15.     public partial class frmGetActualProduction : Form
  16.      
  17.     {
  18.         #region
  19.         private string connPCDB = null;
  20.         private CommonPara cp = new CommonPara();
  21.         private string flag = "";//初始化被选中的记录的标志位空
  22.         private int checked_count = 0;//计算被选中的checkbox的数量
  23.         private int bin = -1;
  24.         #endregion

  25.         private delegate bool DoWorkDelegate();

  26.         public frmGetActualProduction()
  27.         {
  28.             InitializeComponent();
  29.             this.loadingPanel1.OnRotateStateChanged += new LoadingPanel.RotateStateChangedHandler(loadingPanel1_OnRotateStateChanged);
  30.             SelectionRenderer sr = new SelectionRenderer();
  31.             sprshow.SelectionRenderer = sr;
  32.         }

  33.         private void cmdExit_Click(object sender, EventArgs e)
  34.         {
  35.             this.Close();
  36.         }

  37.         
  38.         private void frmGetActualProduction_Load(object sender, EventArgs e)
  39.         {
  40.             try
  41.             {
  42.                 connPCDB = cp.GetConString();
  43.                 SqlHelper sh = new SqlHelper(connPCDB);
  44.                 DataSet ds = sh.ExecuteDatasetSQL("SELECT c1,c2,0 as c3, c4  FROM   tabel1 ");
  45.                 setSpreadData(ds.Tables[0]);
  46.             }
  47.             catch (Exception)
  48.             {
  49.                
  50.             }
  51.         }
  52.    

  53.         private void setSpreadData(DataTable spdt)
  54.         {
  55.             if (this.sprshow.ActiveSheet.RowCount > 0)
  56.             {
  57.                 this.sprshow.ActiveSheet.Rows.Count = 0;
  58.             }
  59.             this.sprshow.ActiveSheet.Rows.Count = spdt.Rows.Count;


  60.             DataRowCollection rows = spdt.Rows;
  61.             int rowCount = rows.Count;
  62.             int nowRow = 0;
  63.             for (int i = 0; i < rowCount; i++)
  64.             {
  65.                 sprshow.ActiveSheet.Cells[nowRow, 0].Value = rows[i]["A"].ToString();
  66.                 sprshow.ActiveSheet.Cells[nowRow, 1].Value = rows[i]["B"].ToString();
  67.                 sprshow.ActiveSheet.Cells[nowRow, 2].Value = rows[i]["C"].ToString();
  68.                 sprshow.ActiveSheet.Cells[nowRow, 3].Value = rows[i]["D"].ToString();

  69.                 nowRow++;
  70.             }
  71.         }

  72.         private void sprshow_ButtonClicked(object sender, FarPoint.Win.Spread.EditorNotifyEventArgs e)
  73.         {
  74.             checked_count = 0;
  75.             
  76.             for (int i = 0; i < sprshow.Sheets[0].Rows.Count; i++)
  77.             {
  78.                 if (checked_count <= 1)
  79.                 {
  80.                     flag = sprshow.Sheets[0].Cells[i, 2].Value.ToString();//复选框是否被选中
  81.                     if (flag == "True")//"True"为选中,"0"为未选中。
  82.                     {
  83.                         int col4_value = int.Parse(sprshow.Sheets[0].Cells[i, 3].Value.ToString());//第4列
  84.                         
  85.                         if (col4_value == 1)
  86.                         {
  87.                             sprshow.Sheets[0].Cells[i, 2].Value = 0;//清除被选的状态
  88.                             bin = int.Parse(sprshow.Sheets[0].Cells[i, 0].Value.ToString());
  89.                             MessageBox.Show(bin);
  90.                             break;
  91.                         }
  92.                         else
  93.                         {
  94.                             checked_count++;
  95.                         }
  96.                     }
  97.                 }
  98.                 else
  99.                 {
  100.                     MessageBox.Show("只能选一个.");
  101.                     checked_count = 0;
  102.                     break;
  103.                 }
  104.             }
  105.         }

  106.         void loadingPanel1_OnRotateStateChanged()
  107.         {
  108.             this.Invoke(new Action(delegate()
  109.             {
  110.                 this.sprshow.Visible = !this.sprshow.Visible;
  111.                 this.Cmdchace.Enabled = !this.Cmdchace.Enabled;
  112.                 this.cmdGetActualProduction.Enabled = !this.cmdGetActualProduction.Enabled;
  113.                 this.cmdExit.Enabled = !this.cmdExit.Enabled;
  114.             }));
  115.         }

  116.         private bool DoWork()
  117.         {
  118.             System.Threading.Thread.Sleep(10000);
  119.             return true;
  120.         }

  121.         private void DoWorkCallBack(IAsyncResult ar)
  122.         {
  123.             AsyncResult result = (AsyncResult)ar;
  124.             DoWorkDelegate caller = (DoWorkDelegate)result.AsyncDelegate;
  125.             bool bResult = caller.EndInvoke(ar);

  126.             this.loadingPanel1.Stop();
  127.         }

  128.         private void cmdGetActualProduction_Click(object sender, EventArgs e)
  129.         {
  130.             if (MessageBox.Show("", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel)
  131.             {
  132.                 return;
  133.             }
  134.             else { //点击的是"OK"按钮
  135.                 int count = 0;//计算被选择的复选框数量
  136.                 string status = "";
  137.                 for (int i = 0; i < sprshow.Sheets[0].Rows.Count; i++)
  138.                 {
  139.                     status = sprshow.Sheets[0].Cells[i, 2].Value.ToString();//复选框是否被选中
  140.                     if (status == "True")//"True"为选中,"0"为未选中。
  141.                     {
  142.                         count++;
  143.                     }
  144.                 }
  145.                 if (count == 0)
  146.                 {
  147.                     MessageBox.Show("请选择.");
  148.                     return;
  149.                 }
  150.                 else if (count > 1)
  151.                 {
  152.                     MessageBox.Show("只能选一个.");
  153.                     return;
  154.                 }
  155.                 else//count == 1
  156.                 {

  157.                         try
  158.                         {
  159.                             connPCDB = cp.GetConString();
  160.                             SqlHelper sh = new SqlHelper(connPCDB);
  161.                             sh.Param = sh.GetNewParam();
  162.                             sh.Param.AddParam("@intBin", SqlDbType.Int, bin);
  163.                             DataSet ds = sh.ExecuteDatasetSP("AcquireMeterActualResults", ref sh.Param, 3000);
  164.                            
  165.                         }
  166.                         catch (Exception)
  167.                         {
  168.                            
  169.                         }  

  170.                 }

  171.             }
  172.         }

  173.         private void Cmdchace_Click(object sender, EventArgs e)
  174.         {
  175.            
  176.             for (int i = 0; i < sprshow.Sheets[0].Rows.Count; i++) {
  177.                  int col4_value = int.Parse(sprshow.Sheets[0].Cells[i, 3].Value.ToString());//第4列
  178.                  if (col4_value==1)
  179.                  {
  180.                      for (int j = 0; j <= i;j++ )
  181.                      {
  182.                          sprshow.Sheets[0].Cells[j, 2].Value = 0;
  183.                      }
  184.                      MessageBox.Show("不能全选.");
  185.                      break;
  186.                 }
  187.                 sprshow.Sheets[0].Cells[i, 2].Value = true;
  188.             }
  189.         }


  190.     }

  191.     public class SelectionRenderer : FarPoint.Win.Spread.ISelectionRenderer
  192.     {
  193.         public void PaintSelection(Graphics g, int x, int y, int width, int height)
  194.         {
  195.             SolidBrush selectionBrush = new SolidBrush(Color.Blue);
  196.             g.FillRectangle(selectionBrush, x, y, width, height);
  197.             selectionBrush.Dispose();
  198.         }
  199.     }
  200. }
复制代码






1.png

12 个回复

倒序浏览
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-11-8 14:56:34
推荐
放到 frmGetActualProduction 构造函数中就可以

评分

参与人数 1满意度 +5 收起 理由
dapsjj + 5 赞一个!

查看全部评分

回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-11-7 20:00:18
沙发
您好,问题收到,测试后给您回复
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-11-8 12:17:41
板凳
我看你只是点击了一个单元格。 如果需要点击一个单元格选中整行需要再加上

            fpSpread1.ActiveSheet.SelectionUnit = FarPoint.Win.Spread.Model.SelectionUnit.Row;
回复 使用道具 举报
dapsjj
初级会员   /  发表于:2016-11-8 14:32:47
地板
dexteryao 发表于 2016-11-8 12:17
我看你只是点击了一个单元格。 如果需要点击一个单元格选中整行需要再加上

            fpSpread1.Activ ...

您好,您这句代码应该加到哪里?
回复 使用道具 举报
dapsjj
初级会员   /  发表于:2016-11-8 15:02:54
6#
最终代码为:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Runtime.Remoting.Messaging;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using MY.BLL;
  12. using MY.Common;

  13. namespace PcSystemMain
  14. {
  15.     public partial class frmGetActualProduction : Form
  16.      
  17.     {
  18.         #region
  19.         private string connPCDB = null;
  20.         private CommonPara cp = new CommonPara();
  21.         private string flag = "";//初始化被选中的记录的标志位空
  22.         private int checked_count = 0;//计算被选中的checkbox的数量
  23.         private int bin = -1;
  24.         #endregion

  25.         private delegate bool DoWorkDelegate();

  26.         public frmGetActualProduction()
  27.         {
  28.             InitializeComponent();
  29.             this.loadingPanel1.OnRotateStateChanged += new LoadingPanel.RotateStateChangedHandler(loadingPanel1_OnRotateStateChanged);
  30.             SelectionRenderer sr = new SelectionRenderer();
  31.             sprshow.SelectionRenderer = sr;
  32.                         sprshow.ActiveSheet.SelectionUnit = FarPoint.Win.Spread.Model.SelectionUnit.Row;
  33.         }

  34.         private void cmdExit_Click(object sender, EventArgs e)
  35.         {
  36.             this.Close();
  37.         }

  38.         
  39.         private void frmGetActualProduction_Load(object sender, EventArgs e)
  40.         {
  41.             try
  42.             {
  43.                 connPCDB = cp.GetConString();
  44.                 SqlHelper sh = new SqlHelper(connPCDB);
  45.                 DataSet ds = sh.ExecuteDatasetSQL("SELECT c1,c2,0 as c3, c4  FROM   tabel1 ");
  46.                 setSpreadData(ds.Tables[0]);
  47.             }
  48.             catch (Exception)
  49.             {
  50.                
  51.             }
  52.         }
  53.    

  54.         private void setSpreadData(DataTable spdt)
  55.         {
  56.             if (this.sprshow.ActiveSheet.RowCount > 0)
  57.             {
  58.                 this.sprshow.ActiveSheet.Rows.Count = 0;
  59.             }
  60.             this.sprshow.ActiveSheet.Rows.Count = spdt.Rows.Count;


  61.             DataRowCollection rows = spdt.Rows;
  62.             int rowCount = rows.Count;
  63.             int nowRow = 0;
  64.             for (int i = 0; i < rowCount; i++)
  65.             {
  66.                 sprshow.ActiveSheet.Cells[nowRow, 0].Value = rows[i]["A"].ToString();
  67.                 sprshow.ActiveSheet.Cells[nowRow, 1].Value = rows[i]["B"].ToString();
  68.                 sprshow.ActiveSheet.Cells[nowRow, 2].Value = rows[i]["C"].ToString();
  69.                 sprshow.ActiveSheet.Cells[nowRow, 3].Value = rows[i]["D"].ToString();

  70.                 nowRow++;
  71.             }
  72.         }

  73.         private void sprshow_ButtonClicked(object sender, FarPoint.Win.Spread.EditorNotifyEventArgs e)
  74.         {
  75.             checked_count = 0;
  76.             
  77.             for (int i = 0; i < sprshow.Sheets[0].Rows.Count; i++)
  78.             {
  79.                 if (checked_count <= 1)
  80.                 {
  81.                     flag = sprshow.Sheets[0].Cells[i, 2].Value.ToString();//复选框是否被选中
  82.                     if (flag == "True")//"True"为选中,"0"为未选中。
  83.                     {
  84.                         int col4_value = int.Parse(sprshow.Sheets[0].Cells[i, 3].Value.ToString());//第4列
  85.                         
  86.                         if (col4_value == 1)
  87.                         {
  88.                             sprshow.Sheets[0].Cells[i, 2].Value = 0;//清除被选的状态
  89.                             bin = int.Parse(sprshow.Sheets[0].Cells[i, 0].Value.ToString());
  90.                             MessageBox.Show(bin);
  91.                             break;
  92.                         }
  93.                         else
  94.                         {
  95.                             checked_count++;
  96.                         }
  97.                     }
  98.                 }
  99.                 else
  100.                 {
  101.                     MessageBox.Show("只能选一个.");
  102.                     checked_count = 0;
  103.                     break;
  104.                 }
  105.             }
  106.         }

  107.         void loadingPanel1_OnRotateStateChanged()
  108.         {
  109.             this.Invoke(new Action(delegate()
  110.             {
  111.                 this.sprshow.Visible = !this.sprshow.Visible;
  112.                 this.Cmdchace.Enabled = !this.Cmdchace.Enabled;
  113.                 this.cmdGetActualProduction.Enabled = !this.cmdGetActualProduction.Enabled;
  114.                 this.cmdExit.Enabled = !this.cmdExit.Enabled;
  115.             }));
  116.         }

  117.         private bool DoWork()
  118.         {
  119.             System.Threading.Thread.Sleep(10000);
  120.             return true;
  121.         }

  122.         private void DoWorkCallBack(IAsyncResult ar)
  123.         {
  124.             AsyncResult result = (AsyncResult)ar;
  125.             DoWorkDelegate caller = (DoWorkDelegate)result.AsyncDelegate;
  126.             bool bResult = caller.EndInvoke(ar);

  127.             this.loadingPanel1.Stop();
  128.         }

  129.         private void cmdGetActualProduction_Click(object sender, EventArgs e)
  130.         {
  131.             if (MessageBox.Show("", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel)
  132.             {
  133.                 return;
  134.             }
  135.             else { //点击的是"OK"按钮
  136.                 int count = 0;//计算被选择的复选框数量
  137.                 string status = "";
  138.                 for (int i = 0; i < sprshow.Sheets[0].Rows.Count; i++)
  139.                 {
  140.                     status = sprshow.Sheets[0].Cells[i, 2].Value.ToString();//复选框是否被选中
  141.                     if (status == "True")//"True"为选中,"0"为未选中。
  142.                     {
  143.                         count++;
  144.                     }
  145.                 }
  146.                 if (count == 0)
  147.                 {
  148.                     MessageBox.Show("请选择.");
  149.                     return;
  150.                 }
  151.                 else if (count > 1)
  152.                 {
  153.                     MessageBox.Show("只能选一个.");
  154.                     return;
  155.                 }
  156.                 else//count == 1
  157.                 {

  158.                         try
  159.                         {
  160.                             connPCDB = cp.GetConString();
  161.                             SqlHelper sh = new SqlHelper(connPCDB);
  162.                             sh.Param = sh.GetNewParam();
  163.                             sh.Param.AddParam("@intBin", SqlDbType.Int, bin);
  164.                             DataSet ds = sh.ExecuteDatasetSP("AcquireMeterActualResults", ref sh.Param, 3000);
  165.                            
  166.                         }
  167.                         catch (Exception)
  168.                         {
  169.                            
  170.                         }  

  171.                 }

  172.             }
  173.         }

  174.         private void Cmdchace_Click(object sender, EventArgs e)
  175.         {
  176.            
  177.             for (int i = 0; i < sprshow.Sheets[0].Rows.Count; i++) {
  178.                  int col4_value = int.Parse(sprshow.Sheets[0].Cells[i, 3].Value.ToString());//第4列
  179.                  if (col4_value==1)
  180.                  {
  181.                      for (int j = 0; j <= i;j++ )
  182.                      {
  183.                          sprshow.Sheets[0].Cells[j, 2].Value = 0;
  184.                      }
  185.                      MessageBox.Show("不能全选.");
  186.                      break;
  187.                 }
  188.                 sprshow.Sheets[0].Cells[i, 2].Value = true;
  189.             }
  190.         }


  191.     }

  192.     public class SelectionRenderer : FarPoint.Win.Spread.ISelectionRenderer
  193.     {
  194.         public void PaintSelection(Graphics g, int x, int y, int width, int height)
  195.         {
  196.             SolidBrush selectionBrush = new SolidBrush(Color.Blue);
  197.             g.FillRectangle(selectionBrush, x, y, width, height);
  198.             selectionBrush.Dispose();
  199.         }
  200.     }
  201. }
复制代码
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-11-8 15:14:20
7#
还有什么问题吗
回复 使用道具 举报
dapsjj
初级会员   /  发表于:2016-11-8 15:36:57
8#
本帖最后由 dapsjj 于 2016-11-9 07:44 编辑

颜色太重文字被覆盖了,如第1幅图所示效果。怎么能把文字显示出来?再有就是被点的这个单元格没有变为蓝色。想要成第2幅图效果。
2016-11-08_150632.png
164622n15w3jm0z11imi1i.png
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-11-8 16:52:26
9#
您好,因为spread不是一个传统的grid 控件,所以肯定是有一个activecell的,如果您的spread没有设置单元格背景色的话,可以换成下面的方式吧。

  1.       

  2.         public Form1()
  3.         {
  4.             InitializeComponent();  
  5.     fpSpread1.CellClick += FpSpread1_CellClick;
  6.         }

  7.         private void FpSpread1_CellClick(object sender, CellClickEventArgs e)
  8.         {
  9.             foreach(Row row in fpSpread1.ActiveSheet.Rows)
  10.             {
  11.                 row.BackColor = Color.Empty;
  12.             }

  13.             fpSpread1.ActiveSheet.Rows[e.Row].BackColor = Color.SkyBlue;
  14.         }
复制代码
回复 使用道具 举报
dapsjj
初级会员   /  发表于:2016-11-9 08:09:16
10#
本帖最后由 dapsjj 于 2016-11-9 08:11 编辑
dexteryao 发表于 2016-11-8 16:52
您好,因为spread不是一个传统的grid 控件,所以肯定是有一个activecell的,如果您的spread没有设置单元格 ...

您好,spread我这边是有背景色的,如图中所示淡黄色,我试着在您提供的代码基础上加上了一句:
    sprdMain.ActiveSheet.Rows[e.Row].ForeColor = Color.White;想让被点中的那一行文字的颜色变为白色,但是发现被点过的行文字的颜色变为白色后无法恢复了,如下图所示,请问怎么处理?
代码为:
  1. private void sprdMain_CellClick(object sender, FarPoint.Win.Spread.CellClickEventArgs e)
  2.         {
  3.             foreach (Row row in sprdMain.ActiveSheet.Rows)
  4.             {
  5.                 row.BackColor = Color.Empty;
  6.             }

  7.             sprdMain.ActiveSheet.Rows[e.Row].BackColor = Color.Blue;
  8.             sprdMain.ActiveSheet.Rows[e.Row].ForeColor = Color.White;
  9.         }

  10.     }
复制代码


第一幅图片是刚加载页面时候的样子,第二副图片是鼠标点击了前2行后再点击第三行的样子。如何让前2行被点过后恢复黑色文字的状态?
1.png
2.png
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部