将定期更新的数据数组绑定到DataGridView

时间:2014-12-24 14:24:24

标签: c# winforms datagridview datatable

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

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;
    }

2 个答案:

答案 0 :(得分:0)

闪烁来自于持续隐藏并显示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;

答案 1 :(得分:0)

是的我确实,但我一定忘记在这里发布我的答案。看起来使用它们的名称访问行和列比通过索引访问它们更容易。所以我改变了我的解决方案。首先,我在表单加载时用零填充整个网格,然后在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];
        }
    }

说实话,我仍然没有得到它的确切运作方式,但我当时时间确实没有时间,这对我帮助很大。