为什么DataGridView不刷新?

7
我按下按钮后会发生以下情况:
    dataGridView1.DataSource = ConnectandReadList(some_query);
    dataGridView1.Refresh();

请注意,我正在使用另一个名为chart1的控件进行操作,这个方法可以正常运行,它会用新的数据填充它,但是datagridview却没有变化。
第一次尝试是成功的。
然而,第二次按下按钮后,它显示的仍然是相同的内容!
有人知道我是否正确地刷新了datagridview吗?

ConnectandReadList 返回的数据是否不同? - Gabe
@gmcalab 当然,绝对没问题。 - Alex Gordon
那个方法到底返回了什么?还有:你此时是否在UI线程上? - Marc Gravell
我承认DataGridView上的Refresh方法看起来像是可以刷新数据,但实际上它只是"强制控件使其客户区域无效并立即重绘自身和任何子控件"。BindingSource万岁!我在这个页面上发表了很多评论,但大多数答案都没有涉及到上述的Refresh()方法,这是错误的使用方式,只会增加清除DataGridView并重新设置的代码量! - Paul C
9个回答

13
在这里与 @Fake 有微妙的不同,调用 Refresh() 并不能起作用,因为仅在 dataGridView 上调用此方法。

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

由于此方法与任何控件相关,而不是与对象数据的刷新相关。请参考 此处(DataGridView 方法) 并向下滚动到刷新,您会看到该链接指向 Control.Refresh 方法。
您需要像这样做:
BindingSource bs = new BindingSource(); 
bs.DataSource = ConnectandReadList(some_query);
dataGridView1.DataSource = bs;
bs.ResetBindings(false)

接着你只需要调用 ResetBindings() 方法在你的 BindingSource 上 (bs)。

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

3
重置数据绑定功能非常好用。对于像这样的问题,有许多列出的建议,但是只有这个可以用于数据绑定的DataGridView控件。作为答案,应该接受此解决方法,因为被接受的答案链接到一个没有解决方案的论坛帖子... - wesmantooth

3

如果您将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 });

有人能提供一些关于ToList()的见解以及它为什么有效的解释吗? - Rod

1

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

您需要重置DataGridView 如此以便数据重新绑定。(链接是针对VB的,但您只需要知道要调用的方法。即使复制/粘贴也过度了。)


0

你可以像 @cycl 建议的那样做,也可以使用 BindingSource,我相信这是微软推荐的方法。

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

0

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

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

0

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

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

0
你尝试在调用 Refresh() 之前调用 EndEdit() 了吗?

在这种情况下,我认为Refresh()不是他们所需要的。https://dev59.com/gVHTa4cB1Zd3GeqPTaqw#14501458 - Paul C

-1

试试这个?

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

2
Refresh() 不能用于刷新数据! - Paul C

-1

你第一次初始化数据源时是否在 if(!Page.IsPostback) 中?

这可能会导致每个 postback 重置数据源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接