c# datagridview 中DataSource的使用总结

本文介绍了一种使用DataGridView进行实时数据更新的方法,通过BindingSource组件有效提高数据更新效率,避免了重复检索带来的性能损耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     由于当前项目的窗体更新使用的是订阅事件的方式。其中有个datagridview 动态显示统计数据的列表框。本来想用textbox显示,但不规则,看起来也不美观,改由dgv显示。

我没打算用改dgv表的方式更新表内数据,涉及到检索重复等相关的要求,比如第一个事件 把某个产品加入,第二个事件来之后如果是跟第一个事件产品一样,在这个产品数加1,若不一样则另起一行。每次事件都要检索对比一次,导致效率降低

因为我已经对这些操作在前道里边通过list做了判断。所以在dgv里边在做一次重复操作显然多此一举,我需要 的是直接把打好的包 通过datasource的方式传递给dgv。

  在实践过程中,涉及到几个问题;

 第一,数据源不能是普通的list ,要用到bindinglist 或者bindingsource方法,最终觉得BindingSource 的方式最好。

第二,bingdinglist 直接赋值给dgv.DataSource ,dgv窗体不显示更新,尽管数值已经改变,但窗体就是不反应,  bingdinglist.refresh 或者reset 也没什么用。这里边的探索没有进一步深入,因为最终用bindingsource解决

代码很简单

  void OnOverTopInOrderForm(ReOverTopinOrderArgs e)    //接收事件
        {
          
            BindingSource bs = new BindingSource(); 
            if (dgvovertop.InvokeRequired)
            {
                dgvovertop.BeginInvoke(new MethodInvoker(delegate
                {
                    ReOverTopinOrder reovre;//= new ReOverTopinOrder();
                    foreach (var item in e.Reovertopinorderlist)
                    {
                        reovre = new ReOverTopinOrder();
                        reovre.卷烟名称 = item.卷烟名称;
                        reovre.已扫数量 = item.已扫数量;
                        //reovertb_list.Add(reovre);
                        //reovertb_list.
                        bs.Add(reovre);                      
                    }
                   dgvovertop.DataSource= bs;     //赋值控件自动更新

//var dt= dgvovertop.DataSource as BindingList<ReOverTopinOrder>; // dt. // reovertb_list = e.Reovertopinorderlist; // dgvovertop.Refresh(); // reovertb_list.ResetBindings(); // bdlst.AddingNew // dgvovertop.DataSource = mess; // reovertb_list.Add(reovre); })); } else { // dgvovertop.DataSource = mess; } // dgvovertop.Refresh(); // reovertb_list.ResetBindings(); // ControlHelper.ShowDgvControl1(dgvovertop); // reovertb_list = e.Reovertopinorderlist; }

 一下是参考文章

http://www.cnblogs.com/monkeyZhong/p/4530795.html

 

转载于:https://www.cnblogs.com/zuochanzi/p/6247946.html

<think>好的,用户想解决C#dataGridViewDataSource出现空值的问题。首先,我需要回忆一下处理数据绑定时常见的空值情况。根据提供的引用,特别是引用[4],里面提到绑定List集合时如果字段没有get和set会导致显示空白,这可能是一个原因。用户可能没有正确设置类的属性,导致数据源绑定失败。 接下来,用户可能遇到数据源本身为空的情况。这时候需要检查DataSource是否被正确赋值,或者在赋值之前是否没有初始化数据源,导致控件无法显示数据。引用[1]提到设置DataSource和DataMember来绑定数据源,如果数据源为空,控件自然显示空白。 然后,处理数据中的null值。例如,数据行中的某些字段可能为null,直接显示会影响界面。可以通过CellFormatting事件来自定义显示内容,比如将null替换为“无数据”或空字符串。引用[3]中的遍历DataGridView行的例子,可能在处理时没有考虑null值,导致异常。 另外,数据列的定义是否正确也很重要。如果DataPropertyName没有正确对应到数据源的字段,或者字段名拼写错误,也会导致列内容为空。需要检查列的设置是否正确,特别是是否使用了DataPropertyname属性,如引用[4]所述。 最后,异常处理和数据验证也是关键。在绑定数据之前,应该检查数据源是否为null,并处理可能的异常,避免程序崩溃。用户可能在绑定数据时没有进行空值检查,导致控件无法显示。 综合以上分析,解决方案应包括检查类属性、处理数据源空值、格式化单元格内容、验证列绑定以及添加异常处理。需要逐步排查这些可能的问题点,确保每一步都正确无误,从而解决dataGridView显示空值的问题。</think>### 解决DataGridView DataSource空值问题的分步方法 #### 1. **验证数据源结构** - 确保绑定的类属性包含`get; set;`访问器 错误示例:`public string Name;` 正确示例:`public string Name { get; set; }` 若字段未包含访问器,DataGridView无法识别绑定字段[^4]。 #### 2. **处理空数据源** ```csharp if (dataList == null || dataList.Count == 0) { dataGridView1.DataSource = new List<object> { new { Message = "暂无数据" } }; } else { dataGridView1.DataSource = dataList; } ``` #### 3. **单元格空值格式化** ```csharp // 在DataGridView初始化时添加事件 dataGridView1.CellFormatting += (sender, e) => { if (e.Value == null) { e.Value = "N/A"; e.FormattingApplied = true; } }; ``` #### 4. **验证列映射** ```csharp // 手动创建列时设置DataPropertyName dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "用户编号", DataPropertyName = "UserId" // 必须与数据源属性名完全一致 }); ``` #### 5. **空值预处理(LINQ方式)** ```csharp var processedData = rawData.Select(x => new { ID = x.ID ?? 0, Name = x.Name ?? "未知用户" }).ToList(); ``` #### 6. **绑定后刷新验证** ```csharp dataGridView1.DataSource = null; // 先清空绑定 dataGridView1.DataSource = processedData; if (dataGridView1.Rows.Count == 0) { MessageBox.Show("数据加载异常,请检查数据源"); } ``` #### 7. **异常处理** ```csharp try { // 绑定操作代码 } catch (NullReferenceException ex) { // 记录日志并显示友好提示 } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值