【问题标题】:why doesn't datagridview refresh?为什么datagridview不刷新?
【发布时间】:2010-11-05 16:40:07
【问题描述】:

这是我按下按钮后发生的情况:

    dataGridView1.DataSource = ConnectandReadList(some_query);
    dataGridView1.Refresh();

请注意,我正在使用另一个名为 chart1 的控件执行此操作,它可以正常工作,它会使用新的请求数据填充它,但 datagridview 只是保持不变

第一次尝试成功。

但是我第二次按下它,它显示同样的东西!

有人知道我是否正确刷新了datagridview吗?

【问题讨论】:

  • ConnectandReadList 是否返回不同的数据?
  • @gmcalab 肯定是的,
  • 该方法返回什么确切。并且:你当时在 UI 线程上吗?
  • 我承认 DataGridView 上的 Refresh 方法看起来可以刷新数据,但实际上“强制控件使其客户区无效并立即重绘自身和任何子控件”。 BindingSoure一路走好!我在此页面上发表了很多评论,但这些答案中的大多数都没有解决上述 Refresh() 方法,这是使用错误的方法,它只是清除 DataGridView 并重新设置它的更多代码!

标签: c# .net winforms data-binding datagridview


【解决方案1】:

这里与@Fake 有细微的差别,但调用Refresh() 将不起作用,因为仅在 dataGridView 上调用它

“强制控件使其客户区无效并立即重绘自身和任何子控件。”

由于此方法与任何控件相关,而不是与对象相关的数据的刷新。参考here (DataGridView Methods) 并向下滚动到刷新,您将看到指向 Control.Refresh 方法的链接

你想要这样的东西;

BindingSource bs = new BindingSource(); 
bs.DataSource = ConnectandReadList(some_query);
dataGridView1.DataSource = bs;
bs.ResetBindings(false)

然后你就可以在bs(你的BindingSource)上拨打ResetBindings()

BindingSource bs = new BindingSource(); 
private refreshData()
{
    bs.ResetBindings(false)
}

【讨论】:

  • 重置绑定 FTW。对于这样的问题,有很多列出的建议,但这是我必须为数据绑定数据网格视图工作的唯一建议。这应该是答案,因为接受的答案链接到没有解决方案的论坛帖子...
【解决方案2】:

如果你绑定到一个 List,你可以做的小技巧将它设置到你的数据源时,在它的末尾添加 ToList(),如下所示:

dataGridView1.DataSource = ConnectandReadList(some_query).ToList();

由于某种原因,这会导致它在不丢失任何引用或任何内容的情况下刷新。

另一种方法是直接通知 DataGridView 其数据已更改,如下所示:

dataGridView1.DataSource = ConnectandReadList(some_query)
var m = dataGridView1.GetType().GetMethod("OnDataSourceChanged", BindingFlags.NonPublic | BindingFlags.Instance);
m.Invoke(dataGridView1, new object[] { EventArgs.Empty });

【讨论】:

    【解决方案3】:

    第一次分配 DataSource 时,DataGridView 会设置绑定。问题是后续的 DataSource 分配,如果分配的结构与初始分配不同,将会失败,因为绑定现在“关闭”

    您需要重置 DataGridView thusly 以便将数据绑定到新的。 (该链接适用于 VB,但您只需要知道要调用的方法即可。即使复制/粘贴也会过大。)

    【讨论】:

      【解决方案4】:

      您尝试在Refresh() 之前拨打EndEdit() 吗?

      【讨论】:

      【解决方案5】:

      您可以按照@cycl 的建议进行操作,也可以使用 BindingSource,我认为这是微软推荐的方法。

      BindingSource bs = new BindingSource(); 
      bs.DataSource = ConnectandReadList(some_query);
      dataGridView1.DataSource = bs;
      dataGridView1.Refresh;
      

      【讨论】:

        【解决方案6】:

        实际上问题在于您的 TableAdapter 没有刷新。 我在编辑表(mydatabase.tbl)后使用了这段代码来刷新它:

                    tblTableAdapter.Fill(mydatabaseDataSet.tbl);
                    dataGridView1.DataSource = tblBindingSource;
                    dataGridView1.Update();
        

        【讨论】:

          【解决方案7】:

          这行代码将数据加载到wMP_EXPORTDataSet.DEST_AX_PRICEDISCADMTRANSENTITY 表中。您可以根据需要移动或移除它。

          this.dEST_AX_PRICEDISCADMTRANSENTITYTableAdapter.Fill(this.wMP_EXPORTDataSet.DEST_AX_PRICEDISCADMTRANSENTITY);
          

          【讨论】:

            【解决方案8】:

            您是在if(!Page.IsPostback) 中第一次初始化数据源

            可能会在每次回发时重置数据源。

            【讨论】:

              【解决方案9】:

              试试这个?

              dataGridView1.DataSource = null;
              dataGridView1.DataSource = ConnectandReadList(some_query);
              dataGridView1.Refresh();
              

              【讨论】:

              • Refresh() 不能用于刷新数据!
              猜你喜欢
              • 2012-04-05
              • 1970-01-01
              • 1970-01-01
              • 2012-10-25
              • 1970-01-01
              • 1970-01-01
              • 2017-10-31
              • 1970-01-01
              相关资源
              最近更新 更多