【问题标题】:Can't get DataGridView to refresh over Linq to SQL (WinForm)无法让 DataGridView 刷新 Linq to SQL (WinForm)
【发布时间】:2010-12-26 11:32:39
【问题描述】:

这里的情况很奇怪:我正在使用 L2S 来填充 DataGridView。
代码如下:

    private void RefreshUserGrid()
    {
    var UserQuery = from userRecord in this.DataContext.tblUsers
                    orderby userRecord.DisplayName
                    select userRecord;

    UsersGridView.DataSource = UserQuery;

//I have also tried
//this.UserBindingSource.DataSource = UserQuery;
//UsersGridView.Datasource = UserBindingSource;

    UsersGridView.Columns[0].Visible = false;
    }

每当我使用 L2S 从数据库中添加/删除记录时,GridView 都会很好地刷新。
但是,如果有人在编辑网格并犯了错误,我希望他们能够点击刷新按钮并通过从数据源重新加载来消除他们的错误。
对于我的生活,我无法让它工作。

我目前在刷新按钮上使用的代码是这样的:

private void button1_Click(object sender, EventArgs e)
{
    this.DataContext.Refresh(RefreshMode.OverwriteCurrentValues);
    RefreshUserGrid();
}

但该死的 GridView 仍然不受影响。所发生的只是选定的行变为未选中。

我已经尝试过.Refresh().Invalidate(),我已经尝试将 DataSource 更改为 NULL 并再次返回(此处类似帖子的所有建议)....都不起作用。网格刷新的唯一时间是我重新启动应用程序。

我一定错过了一些基本的东西,但我完全被难住了,我的同事也是。
有任何想法吗?

谢谢!

【问题讨论】:

    标签: linq-to-sql datagridview c#-3.0 refresh


    【解决方案1】:

    在尝试了很多方法后,几乎解决了 DataContext.Refresh,我发现了这个清除缓存的巧妙技巧,从而强制更新数据:

    Public Sub ClearCache(Dcontext As DataContext)
        Const FLAGS = BindingFlags.Instance + BindingFlags.Public + BindingFlags.NonPublic
        Dim method = Dcontext.GetType().GetMethod("ClearCache", FLAGS)
        method.Invoke(Dcontext, Nothing)
    End Sub
    

    将此方法添加到您的模块中,然后更新数据即可:

    ClearCache(DataContext)
    UsersGridView.Refresh()
    

    【讨论】:

      【解决方案2】:

      前面的cmets都是真的。重新实例化DataContext即可解决问题

      Dim db As New dbDatosDataContext()
      DataGridView1.DataSource = From l In db.Bultos Select l
      

      【讨论】:

        【解决方案3】:

        您可以通过重新初始化 DataContext 对象来刷新网格。这将释放当前需要更新的 DataContext 对象。但新的实例会自动拥有更新后的值。

        【讨论】:

          【解决方案4】:

          这似乎是 LINQ to SQL 中的一个错误。我从 Janus GridEx 人员那里了解到,问题的原因是 LINQ 向网格提供了一个静态列表,在 DataContext 上调用 Refresh 后该列表未刷新。

          解决方案是简单地重新实例化 DataContext。

          【讨论】:

            【解决方案5】:

            最简单的方法是使用 BindingSource。为类创建一个 BindingSource 实例,将其初始化为数据查询,然后将 BindingSource 分配给 UsersGridView。

            BindingSource 将处理更新等。有几个事件可以被捕获以进行自定义管理。

            This link gives an example of using a BindingSource

            编辑:我的第一篇文章假定使用 Webforms 而不是 WinForms。

            【讨论】:

            • 嗯,我已经尝试过了(在上面的代码中被注释掉了),但我可能没有以正确的方式做到这一点。我会按照本教程再试一次,谢谢!
            猜你喜欢
            • 1970-01-01
            • 2011-03-02
            • 2020-02-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多