none
委托操作DataGridView控件 RRS feed

  • 问题

  • 多线程中想使用委托操作控件DataGridView控件,达到这样的目的:更改某个单元格内容符合要求的背景颜色和选中颜色。该怎么写这段代码?请高手示范,谢谢!

    努力~

    2013年3月20日 8:01

答案

  • 使用类似代码:

    public void ChangeColor()

    {

         if(InvokeRequired)

         {

                if(你的条件)

                {

                       this.Invoke(new MethodInvoke(()=>{dataGridView1.Rows[索引].Cells[索引].Style.BackColor=Color.Red;dataGridView1.Rows[索引].Cells[索引].Style.SelectionForeColor=Color.Green;}));

                }

         }

        else

        {

    dataGridView1.Rows[索引].Cells[索引].Style.BackColor=Color.Red;dataGridView1.Rows[索引].Cells[索引].Style.SelectionForeColor=Color.Green;

        }

    }

    然后用Thread调用即可。

    Thread t = new Thread(ChangeColor);

    t.IsBackGround=true;

    t.Start();


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年3月20日 9:10
    版主
  •         delegate void SetDataGridViewCallback(string s);
            private void SetDataGrid(string s)
            {
                if (this.dataGridView1.InvokeRequired)
                {
                    SetDataGridViewCallback d = new SetDataGridViewCallback(SetDataGrid);
                    this.Invoke(d, new object[] { s });
                }
                else
                {
                    for (int i = 0; i < dataGridView1.RowCount; i++)
                    {
                        for (int j = 0; j < dataGridView1.ColumnCount; j++)
                        {
                            if (dataGridView1[j, i].Value.ToString() == s.ToUpper())
                            {
                                dataGridView1[j, i].Style.BackColor = Color.DeepSkyBlue;
                                dataGridView1[j, i].Style.SelectionBackColor = Color.DeepSkyBlue;
                            }
                        }
                    }
                }
            }

    另一个自己写的类中定义了,这些

            public delegate void SendDataGridValue(string v);
            public event SendDataGridValue SendDGValue;

    然后再使用这个

     实例化后.SendDGValue += new 类名.SendDataGridValue(SetDataGrid);

    其实我想要的就是个,本来写对了,以为是这样写有错就来提问题,结果问题出在其他地方

    努力~



    2013年3月26日 1:23
  • hello,

    建议使用.net内建的委托来处理跨线程的物件,这样可以让你节省一些代码

    //update UI
    this.Invoke((Action)(() =>
    {
        //TODO:处理主线程的控件
    }));



    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年3月26日 3:50

全部回复

  • 使用类似代码:

    public void ChangeColor()

    {

         if(InvokeRequired)

         {

                if(你的条件)

                {

                       this.Invoke(new MethodInvoke(()=>{dataGridView1.Rows[索引].Cells[索引].Style.BackColor=Color.Red;dataGridView1.Rows[索引].Cells[索引].Style.SelectionForeColor=Color.Green;}));

                }

         }

        else

        {

    dataGridView1.Rows[索引].Cells[索引].Style.BackColor=Color.Red;dataGridView1.Rows[索引].Cells[索引].Style.SelectionForeColor=Color.Green;

        }

    }

    然后用Thread调用即可。

    Thread t = new Thread(ChangeColor);

    t.IsBackGround=true;

    t.Start();


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年3月20日 9:10
    版主
  • 感谢MVP的回答,虽然不是我所需求的,而且最终自行解决问题了。还是很感激!谢谢!

    努力~

    2013年3月22日 13:12
  • 感谢MVP的回答,虽然不是我所需求的,而且最终自行解决问题了。还是很感激!谢谢!

    努力~

    哦?可以Share一下你的答案帮助更多的人吗?并且可以标记答案;)

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年3月23日 1:36
    版主
  •         delegate void SetDataGridViewCallback(string s);
            private void SetDataGrid(string s)
            {
                if (this.dataGridView1.InvokeRequired)
                {
                    SetDataGridViewCallback d = new SetDataGridViewCallback(SetDataGrid);
                    this.Invoke(d, new object[] { s });
                }
                else
                {
                    for (int i = 0; i < dataGridView1.RowCount; i++)
                    {
                        for (int j = 0; j < dataGridView1.ColumnCount; j++)
                        {
                            if (dataGridView1[j, i].Value.ToString() == s.ToUpper())
                            {
                                dataGridView1[j, i].Style.BackColor = Color.DeepSkyBlue;
                                dataGridView1[j, i].Style.SelectionBackColor = Color.DeepSkyBlue;
                            }
                        }
                    }
                }
            }

    另一个自己写的类中定义了,这些

            public delegate void SendDataGridValue(string v);
            public event SendDataGridValue SendDGValue;

    然后再使用这个

     实例化后.SendDGValue += new 类名.SendDataGridValue(SetDataGrid);

    其实我想要的就是个,本来写对了,以为是这样写有错就来提问题,结果问题出在其他地方

    努力~



    2013年3月26日 1:23
  • hello

    建議使用.net內建的委拖,可以让你的代码更简洁

    this.Invoke((Action)(() =>
    {
        //TODO:dataGridView操作
    }));



    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年3月26日 3:36
  • hello,

    建议使用.net内建的委托来处理跨线程的物件,这样可以让你节省一些代码

    //update UI
    this.Invoke((Action)(() =>
    {
        //TODO:处理主线程的控件
    }));



    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年3月26日 3:50