【问题标题】:Binding periodically updated data array to DataGridView将定期更新的数据数组绑定到 DataGridView
【发布时间】:2014-12-24 14:24:24
【问题描述】:

我有一个来自 UDP 套接字的 valueArray[125],并且数组每 20 毫秒更新一次。我想在数据网格视图中显示这个数组的每个成员。到目前为止,我可以在网格视图上显示数组,但我有几个问题:

1-gridview 上没有滚动条,所以我只能看到表单中的前 15-20 个数据。

2- 由于刷新过程,datagridview 正在闪烁。

最后我想在“数据”列旁边再添加一列,这样我就可以看到数组的索引。这是我到目前为止所做的:

public void UpdateGridView(byte[] valueArray)
    {
        dataGridView.Visible = false;
        DataTable dt = new DataTable();
        dt.Columns.Add("Data");

        for (int j = 0; j < 125; j++)
        {
            DataRow row = dt.NewRow();
            for (int i = 0; i < 1; i++)
            {
                row[i] = valueArray[j];
            }
            dt.Rows.Add(row);
            dataGridView.DataSource = dt;
        }
        dataGridView.DataSource = dt;
        dataGridView.Visible = true;
    }

【问题讨论】:

  • WPF? ASP.NET? WinForms?
  • 闪烁可能是由于(重新)设置数据源in循环。
  • 哦,抱歉,我一定忘了说 WinForms。我应该只设置一次吗?

标签: c# winforms datagridview datatable


【解决方案1】:

闪烁来自不断隐藏和显示DGV

这是一个没有闪烁的版本,其中包含一个额外的列来显示索引:

public void UpdateGridView(byte[] valueArray)
{
    //  dataGridView.Visible = false;     // < ==
    dataGridView.SuspendLayout();         // < ==
    DataTable dt = new DataTable();

    dt.Columns.Add("Index");             // < ==
    dt.Columns.Add("Data");

    for (int j = 0; j < valueArray.Length; j++)
    {
        DataRow row = dt.NewRow();
        row[0] = j;                      // < ==
        row[1] = valueArray[j];          // < ==
        //for (int i = 0; i < 1; i++)    // < ==
        //{                              // < ==
        //    row[i] = valueArray[j];    // < ==
        //}                              // < ==
        dt.Rows.Add(row)
       // dataGridView.DataSource = dt;
    }
    dataGridView.DataSource = dt;
    dataGridView.ResumeLayout();         // < ==
    //   dataGridView.Visible = true;    // < ==
}

默认情况下,DataGridView 将同时显示ScrollBars。如果你没有,你已经把它们关掉了。要恢复使用设计器或代码,如下所示:

dataGridView.ScrollBars = ScrollBars.Both;  // or..
dataGridView.ScrollBars = ScrollBars.Vertical;

【讨论】:

  • 如果我不隐藏和显示网格,那么著名的“巨大的红色 X 标记”会在几秒钟后出现在我的网格上。当我将你的 sn-p 应用到我的表单时,我不知道为什么,但网格消失了。
  • 我已经测试了代码,这里使用 50 毫秒的计时器可以正常工作。那么,如果 DGV 似乎消失了,是不是您仍然将它隐藏在某个地方,或者没有对代码进行所有更改??
  • 我猜是这样,所以我需要检查我的表单属性,然后我会告诉你结果。非常感谢您的帮助!
【解决方案2】:

是的,我确实有,但我一定忘记在此处发布我的答案。似乎通过使用它们的名称访问行和列比通过它们的索引访问它们更容易。所以我改变了我的解决方案。首先,我在表单加载时用零填充整个网格,然后在 UpgradeGridView 函数中,我通过使用它们的名称直接更改了值。

private void Form1_Load(object sender, EventArgs e)
    {
        Thread ReceiveThread = new Thread(new ThreadStart(ReceiveUDPData));
        comboBox1.Items.Add("04 : Read Input Registers");
        ReceiveThread.IsBackground = true;
        ReceiveThread.Priority = ThreadPriority.Highest;
        ReceiveThread.Start();
        Control.CheckForIllegalCrossThreadCalls = false;

        dt.Columns.Add("Index");
        dt.Columns.Add("Data");
        for (int j = 0; j < 125; j++)
        {
            DataRow row = dt.NewRow();
            row[0] = j;
            row[1] = 0;
            dt.Rows.Add(row);
        }
        dataGridView.DataSource = dt;
    }

public void UpdateGridView(byte[] valueArray)
    {
        for (int j = 0; j < valueArray.Length; j++)
        {
            DataRow row = dt.Rows[j];
            row["Index"] = j+1; 
            row["Data"] = valueArray[j];
        }
    }

说实话,我仍然不知道它是如何工作的,但我当时确实没有时间,这对我帮助很大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多