0

我正在详细解释我的问题。我有一个dataGridViewWindows 主窗体。我有一个计时器,它在单击 button1 时启动。并在单击 button2 时停止。

现在与此同时,我正在计算一些东西并将其放入dataGridView. 这是动态计算。在这个计算中,我使用了一个线程。(我在线程中绝对是新手)。我习惯于Thread.Sleep(100) 计算数据。现在我在一个循环中使用 Thread.Sleep 来计算连续事物的数据。我希望保持各自的计算顺序。在循环的每次迭代之后,我使用dataGridView.Rows.AddRange(DataGridViewRow)计算的新数据添加新行。

但是我没有按顺序获取 dataGridView 中的数据,而且它也没有正确出现。它有时会被消隐并随机出现。

PS - 每次定时器间隔结束时,我都会清除数据。

4

4 回答 4

0

您只能从 UI 线程访问 UI 控件。

如果您尝试从其他线程访问它们,您会发现未定义的行为。

我建议您从阅读这本免费电子书开始:Albahari

于 2012-11-27T12:32:19.370 回答
0

在尝试更新 datagridview 之前,您需要调用 datagridview.InvokeRequired。如果这是真的,那么调用 Invoke 传入您希望执行的委托以及您想要传递的任何数据。

于 2012-11-27T13:52:35.280 回答
0

已解决。实际上,您必须设置Thread.Sleep计时器,使其在您Windows.Forms.Timer的间隔结束之前完成。

于 2012-11-28T06:27:08.180 回答
0

这是设置 Gridview 的线程安全方法。

class Program
{
public static List<string> ChoiceExtension = new List<string>();
static void Main()
{
    ChoiceExtension.Add("One");
    ChoiceExtension.Add("Two");
    ChoiceExtension.Add("Three");
    //Set list as gridsource
    InserttoGrid(ChoiceExtension);

}

public static void SetDataSource(object value)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Path of Extension");
        foreach (var item in value as List<string>)
        {
            dt.Rows.Add(new object[] { item });

        }
        ExtensionList.DataSource = dt;
    }
public static void InserttoGrid(List<string> List)
    {
        if (ChoiceExtension.Count >0)
        {

            if (this.ExtensionList.InvokeRequired)
            {
               ExtensionList.Invoke(new SetDataSourceDelegate(SetDataSource), new Object[] { List });


            }
            else
            {
                SetDataSource(List);

            }

        }
    }

}
于 2017-05-15T08:20:00.947 回答