【问题标题】:Display DataTable in a simple GUI c#在简单的 GUI c# 中显示 DataTable
【发布时间】:2016-08-04 11:34:48
【问题描述】:

我有一个用 c# 编写的程序,它接收来自具有多个 IP 地址的不同来源的 UDP 数据包。

我创建了一个数据表来存储所有这些 IP 地址和链接到源的信息,并且我尝试在运行它时在程序中显示该表。

因为程序一直在监听 UDP 包,所以表的查看应该是实时更新的。

我已经搜索过Datagridview,但是我没有成功使用它。

我想以一种非常简单的方式在屏幕上显示如下内容: Data Viewing

static void Main(string[] args)
        {
            DataTable CommunicationTable = new DataTable();
            initDataTableCommunication(CommunicationTable);

            senderIdentifier SmartphoneTest = new senderIdentifier();
            SmartphoneTest.addressIP = "192.120.120.0";
            SmartphoneTest.message = "Started";
            SmartphoneTest.port = 11000;

            newEntryDateTableCom(SmartphoneTest, CommunicationTable);

            senderIdentifier SmartphoneTest2 = new senderIdentifier();
            SmartphoneTest2.addressIP = "192.120.45.9";
            SmartphoneTest2.message = "Done";
            SmartphoneTest2.port = 11000;

            newEntryDateTableCom(SmartphoneTest2, CommunicationTable);

这里我“手动”完成了 DataTable,但新条目将通过接收 UDP 数据包来创建

目前,我只能使用 Debug 可视化 DataTable,使用 DataTable (Visual Studio) 手表上的“范围”

对不起,我的英语很差,提前谢谢

【问题讨论】:

  • 您是真的在谈论在控制台窗口中显示数据,还是您有类似 Windows 窗体的 UI 并想知道如何使用 datagridview?首先,Console 类有很多设置光标位置和颜色的方法,因此您应该能够“绘制”和更新表格。第二个版本有点过于宽泛,无法在这里回答,但是网上有很多文章、操作方法和教程。
  • 是的,我更愿意为 Windows 创建一个 UI,而不是在控制台中一次又一次地打印同一个表。如果代码不多的话,我对使用 datagridview 和表单很感兴趣。
  • 您为DataGridviewDataSource 属性分配了什么?它是DataTable 实例还是一些通用集合?
  • 不,我没有,我只是在 Main() 中创建了一个新数据表: static void Main(string[] args) { DataTable CommunicationTable = new DataTable(); initDataTableCommunication(CommunicationTable); } 然后通过接收UDP数据包自动填表
  • 能否请您分享问题中的相关代码?这可能有助于追踪问题。

标签: c# datagridview datatable


【解决方案1】:

您必须创建一个新的 Windows 窗体项目并在其上放置一个 DataGridView 控件。将您的CommunicationTable 定义为您新创建的表单的一个字段,并将您的CommunicationTable 初始化放在初始化代码中的某个位置(表单的构造函数是一个很好的候选者)。此初始化还应将DataGridviewDataSource 属性设置为CommunicationTable

然后在单独的线程中运行您的 UDP 侦听例程并使其更新CommunicationTable。但是不要忘记使用Form.Invoke() 来更新GUI线程中的数据。

这是一个简化的例子:

DataTable CommunicationTable = new DataTable();
Thread listeningThread;
public Form1()
{
    InitializeComponent();
    CommunicationTable.Columns.Add("addressIP", typeof(string));
    CommunicationTable.Columns.Add("port", typeof(int));
    CommunicationTable.Rows.Add("127.0.0.1", 1100);

    // Notice this assignment:
    dataGridView1.DataSource = CommunicationTable;

    listeningThread = new Thread(() => {
        // UDP listener emulator.
        // Replace with actual code but don't forget the Invoke()
        for (int i = 0; i < 10; i++)
        {
            Invoke((MethodInvoker)delegate {
                CommunicationTable.Rows.Add("127.0.0.1", 1024 + i); });
            Thread.Sleep(300);
        }
    });
    listeningThread.Start();
}

【讨论】:

  • 非常感谢,我会尝试该解决方案,如果可行则将其标记为答案
  • 我同意您的解决方案,但我更愿意使用 ThreadPool.QueueUserWorkItemBackgroundWorker :)
  • @SofteEng,说得好。是的,ThreadPool.QueueUserWorkItem 是一个选项。然而在这种特殊情况下,我宁愿同意stackoverflow.com/a/6193066/4295017,因为我们有一个“持久、专用、长期运行的线程”。无论如何,在我们的案例中,这两个选项都可以,而选择哪一个更多的是编程品味的问题。
  • 感谢您的回答。您如何设法将 DataGridView 放在 Windows 窗体项目上?我在项目或用户控件中找不到 DataGridView
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多