C# 将 DataTable 绑定到现有 DataGridView 列定义

     2023-02-22     185

关键词:

【中文标题】C# 将 DataTable 绑定到现有 DataGridView 列定义【英文标题】:C# Bind DataTable to Existing DataGridView Column Definitions 【发布时间】:2011-02-13 04:09:09 【问题描述】:

我一直在与 NullReferenceException 作斗争,希望这里有人能够为我指明正确的方向。我正在尝试创建和填充 DataTable,然后在 DataGridView 控件中显示结果。基本代码如下,在我调用新的 UpdateResults_Delegate 时,执行以 NullReferenceException 停止。奇怪的是,在从 QueryEventEntries 返回条目之前,我可以成功地跟踪 entry.Rows.Count,因此我至少可以显示 1) 条目不是空引用,并且 2) DataTable 包含数据行。我知道我一定做错了什么,但我就是不知道是什么。

private void UpdateResults(DataTable entries)

    dataGridView.DataSource = entries;


private void button_Click(object sender, EventArgs e)

    PerformQuery();


private void PerformQuery()

    DateTime start = new DateTime(dateTimePicker1.Value.Year,
                                  dateTimePicker1.Value.Month,
                                  dateTimePicker1.Value.Day,
                                  0, 0, 0);

    DateTime stop  = new DateTime(dateTimePicker2.Value.Year,
                                  dateTimePicker2.Value.Month,
                                  dateTimePicker2.Value.Day,
                                  0, 0, 0);

    DataTable entries = QueryEventEntries(start, stop);
    UpdateResults(entries);


private DataTable QueryEventEntries(DateTime start, DateTime stop)

    DataTable entries = new DataTable();
    entries.Columns.AddRange(new DataColumn[] 
        new DataColumn("event_type", typeof(Int32)),
        new DataColumn("event_time", typeof(DateTime)),
        new DataColumn("event_detail", typeof(String)));

    using (SqlConnection conn = new SqlConnection(DSN))
    
        using (SqlDataAdapter adapter = new SqlDataAdapter(
            "SELECT event_type, event_time, event_detail FROM event_log " +
            "WHERE event_time >= @start AND event_time <= @stop",
            conn))
        
            adapter.SelectCommand.Parameters.AddRange(new Object[] 
                new SqlParameter("@start", start),
                new SqlParameter("@stop", stop));
            adapter.Fill(entries);
        
    
    return entries;


更新

我想总结并提供一些我从这里的讨论和调试工作中学到的额外信息,因为我最初发布了这个问题。

我正在重构从数据库中检索记录的旧代码,将这些记录收集为一个数组,然后遍历该数组以逐行填充 DataGridView。线程最初的实现是为了在不必要的循环期间补偿和保持 UI 响应。我已经剥离了线程/调用;现在一切都发生在同一个执行线程上(谢谢Sam)。

我正在尝试使用可以填充 DataAdapter 的 DataTable 来替换缓慢、笨拙的方法,并通过它的 DataSource 属性分配给 DataGridView(以上代码已更新)。

在将其分配为 DataGridView 的 DataSource 之前,我已经遍历条目 DataTable 的行以验证该表是否包含预期的数据。

foreach (DataRow row in entries.Rows)

    System.Diagnostics.Trace.WriteLine(
        String.Format("0 1 2", row[0], row[1], row[2]));

DataGridView 的列之一是自定义 DataGridViewColumn,用于对 event_type 值进行样式化。抱歉,我之前在原帖中没有提到这一点,但我不知道这对我的问题很重要。我已将此列暂时转换为标准 DataGridViewTextBoxColumn 控件,并且不再遇到异常。

DataTable 中的字段附加到已在 DataGridView 的设计视图中预先指定的字段列表中。记录的值被填充到这些附加字段中。当运行时尝试呈现单元格时,会提供一个空值(因为 应该呈现的值 已完成,因此会覆盖几列)。

鉴于此,我正在重新命名并重新标记问题。如果有经验的其他人可以指导我如何将 DataTable 绑定到 DataGridView 的现有列定义,我仍然会很感激。

【问题讨论】:

为什么要在单独的线程中读取数据库? 我试图重构的旧代码被编写为从数据库中读取结果,遍历它们以填充数组,然后返回数组...然后将其输入 UpdateResults然后遍历数组并逐行填充DataGridView。根据行数,这可能需要几秒钟,线程可能是保持 GUI 响应的方式。 您不应从非 UI 线程更新 UI 组件。我不明白这会如何导致 NRE,它应该是别的东西,但它可能是相关的。 我能够重新创建您发布的代码并且它在没有 NullReferenceException 的情况下工作。我认为问题与您在 cmets 中向 Sam 提到的自定义数据类型有关。您能给我们提供有关该自定义类型的更多信息吗?例如,构造函数或属性设置器有什么特别之处吗?另外,如果你不在单独的线程上调用,你会得到异常吗? 【参考方案1】:

您需要确保每列的DataPropertyName 属性设置为DataColumnColumnName 的对应名称。

您可能还需要将DataGridViewAutoGenerateColumns 属性设置为false

我找到了解决方案here。

【讨论】:

【参考方案2】:

如果错误发生在UpdateResults 内部,那么听起来dataGridView 为空。

private void UpdateResults(DataTable entries)

    dataGridView.DataSource = entries; // when is dataGridView set?

【讨论】:

dataGridView 已设置并显示在表单上。我使用 Visual Studio 中的 UI 编辑器放置它,并命名它的列、格式等。 @Timothy,那么错误到底发生在哪一行?什么是完整的堆栈跟踪?您是否附加了调试器并单步执行以查看什么是 null? 我尝试在应用程序的其他地方以类似的方式重构代码,尽管我添加到 dataTable 的元素之一是自定义数据类型。 entry.Columns.Add("colCustType", typeof(CustDataType)); CustDataType ct = new CustDataType(); ct.Property = 结果.GetInt32(2); entry.Rows.Add(..., ct, ...);在这里,我在自定义 dgvCell 的绘制方法中进一步沿着执行路径获取 NRE。也许他们是相似的?第一个表中还有一个自定义 dgvCell,也许我无法正确识别由于线程而发生异常的位置? @Sam,时间不早了。我将尝试在明天晚上逐步完成,并在此处向您更新结果。感谢您的建议! @Timothy,既然你有一个新问题,请在 Stack Overflow 上再问一个问题。这样你会得到更好的回应,而不是在 cmets 中问更多问题。请务必发布与 DataGridView 数据填充和 aspx 相关的代码。

无法刷新绑定到 DataTable 的 DataGridView

】无法刷新绑定到DataTable的DataGridView【英文标题】:UnabletorefreshDataGridViewthatisboundtoaDataTable【发布时间】:2019-04-1122:58:50【问题描述】:我已经使用论坛上的其他答案尝试了所有方法。我只是希望我的数据网格视图在进行更改后... 查看详情

c#将datatable生成easyui的绑定tree的json数据格式

...解析的接送数据,我们可以通过c#将我们从数据库中得到datatable转换成那样的格式,datagrid的好转换,简单的循环拼串就可以,不过easyui绑定树的时候的接送数据格式稍有不同,比datagrid和datagridtree得到json数据要稍微复杂一些,... 查看详情

DataTable 从 C# 中的现有数据库结构自动填充

】DataTable从C#中的现有数据库结构自动填充【英文标题】:DataTableautofilledfromexistingdatabasestructureinC#【发布时间】:2022-01-1916:39:44【问题描述】:我有一个WinForm要求在文本框中插入电子邮件,单击搜索按钮后,sql查询将搜索表中... 查看详情

c#使用datatable进行数据绑定

    privatevoidbtnReport2_Click(objectsender,EventArgse)          //绑定数据到下拉列表      DataBasedb=newDataBase();      db.Open();      DataTabledt   =db.GetTableBySql("select*fromsupp where[Ty 查看详情

c#如何读取html格式的excel表格绑定到datatable中?求助大神!

...ing.UTF8)读取为字符串数组,然后读取里面的字符串添加到dataTable中。有没有更好的方法?参考技术A读取Excel首先你在引用中得引用MicrosoftofficeExcel20**对应的dll文件,才能读取到Excel的数据在类里面引用:System.Data.OleDb;staticpublicData... 查看详情

如何将 DataTable 绑定到 Datagrid

】如何将DataTable绑定到Datagrid【英文标题】:HowtobindDataTabletoDatagrid【发布时间】:2014-01-1306:14:02【问题描述】:我在将DataTable绑定到DataGrid时遇到问题。我已经寻找解决方案,但无法摆脱错误。绑定在使用WindowsForms时工作正常,... 查看详情

C# DataTable 更新 Access 数据库

】C#DataTable更新Access数据库【英文标题】:C#DataTableupdateAccessDatabase【发布时间】:2014-01-0814:46:27【问题描述】:如何将DataTable保存到文件中。accdb(Access)现有一个?我使用了以下代码,但它不起作用:using(OleDbConnectionoledbConnection=n... 查看详情

如何使用 Core Data 将 magicRecord 添加到现有项目中?

...:我有一个处于开发后期的可可项目。我使用核心数据和绑定。最近我想测试magicRecord,只是因为它似乎可以帮助我减少大量繁琐的coredata代码甚至子类化实体。这似乎是一个使用coca 查看详情

如何将 DataTable 绑定到 DataGrid

】如何将DataTable绑定到DataGrid【英文标题】:HowBindDataTabletoDataGrid【发布时间】:2011-10-1202:24:39【问题描述】:这是我的数据表。DataTable_simpleDataTable=newataTable();varperson=newDataColumn("Person")DataType=typeof(Person);_simpleDataTable.Columns.A 查看详情

将 DataGrid 绑定到两个 DataTable

】将DataGrid绑定到两个DataTable【英文标题】:BindingDataGridtotwoDataTable【发布时间】:2015-12-1408:31:56【问题描述】:我有两个DataTable,它们的结构、架构和约束完全相同,但行不同。我需要将这些表显示为DataGrid,并连接在一起,即... 查看详情

将行号列添加到绑定到 DataTable 的 DataGridView

】将行号列添加到绑定到DataTable的DataGridView【英文标题】:AddrownumbercolumntoDataGridViewboundtoDataTable【发布时间】:2020-03-1306:41:33【问题描述】:在ADO.NET中,我使用DataAdapter.Fill(..)调用来使用数据库中的值填充DataTable。然后我将DataTa... 查看详情

如何在c#中将数据表绑定到datagridview

...何在c#中将数据表绑定到datagridview【英文标题】:howtobinddatatabletodatagridviewinc#【发布时间】:2013-10-0111:09:49【问题描述】:我需要将我的DataTable绑定到我的DataGridView。我这样做:DTable=newDataTable();SBind=newBindingSource();//ServersTable-DataG... 查看详情

C# 问题:如何将在 DataGridView 中所做的更改保存回使用的 DataTable?

】C#问题:如何将在DataGridView中所做的更改保存回使用的DataTable?【英文标题】:C#Issue:HowdoIsavechangesmadeinaDataGridViewbacktotheDataTableused?【发布时间】:2010-10-0522:11:08【问题描述】:我从DataSet中获取DataTable,然后将该DataTable绑定到Da... 查看详情

c#中如何将datatable保存到数据库?

...名空间亲测,100万数据20字段5000毫秒(5秒)publicvoidInsertDatatable(DatatabledatatableA)SqlConnectiondestinationConnection=newSqlConnection(connectionString)//创建一个数据库连接;destinationConnection.Open();SqlBulkCopybulkCopy=newSqlBulkCopy(destinationConnection)//实例... 查看详情

将 DataTable 绑定到已定义列的 Datagridview

】将DataTable绑定到已定义列的Datagridview【英文标题】:BindDataTabletoDatagridviewthatalreadyhavecolumndefined【发布时间】:2013-06-2014:53:25【问题描述】:我正在尝试将DateTable绑定到Datagridview已经有在VS中使用Designer设计的列。DataTable的来源... 查看详情

如何在运行时将 Kendo Grid 与 System.Data.DataTable 绑定

】如何在运行时将KendoGrid与System.Data.DataTable绑定【英文标题】:HowtobindKendoGridwithSystem.Data.DataTableatruntime【发布时间】:2014-09-1414:04:20【问题描述】:我需要在按钮单击的弹出窗口中打开KendoGrid。在按钮单击服务器返回DataTable具... 查看详情

c#使用datatable进行数据绑定

...      DataBasedb=newDataBase();      db.Open();      DataTabledt   =db.GetTableBySql("select*fromsupp where[Type]='生产厂家'");      fac.DataSource  =dt;      fac.DisplayMember="shortName";      fac.ValueMember... 查看详情

在 c# 中使用 Open Xml SDK 将 DataTable 导出到 Excel

】在c#中使用OpenXmlSDK将DataTable导出到Excel【英文标题】:ExportDataTabletoExcelwithOpenXmlSDKinc#【发布时间】:2012-08-0418:42:59【问题描述】:我的程序能够将一些数据和DataTable导出到Excel文件(模板)在模板中,我将数据插入到一些占位... 查看详情