【问题标题】:DataGridView updates itself for the first time only after I resize a column or row只有在我调整列或行的大小后,DataGridView 才会第一次自我更新
【发布时间】:2013-10-11 12:21:15
【问题描述】:

我试图找到解决方案,所以请先检查您的问题! 我在DataGridViewDataTable 之间尝试了BindingSource,但没有用。 我尝试在每个循环之后将DataGridView 绑定到DataSource。问题是DataGridView 的内容即使有数据也不会更新。它只有深灰色。如果在将一些数据添加到我的DataTable 后用鼠标调整列/行的大小,DataGridView 会很好地更新,所有行都会出现!。

这是我的一些代码:

Public Class DatagridviewComponent
dim sataSet as New DataTable
Public Sub New()
 InitializeComponent()
 me.dataSet.Columns.Add("Name", GetType(String))
 DataGridViewProcesses.DataSource = dataSet
End Sub

所以,一个简单的DataGridView 绑定到一个DataTable。 现在,我在那之后做什么......

Public Sub UpdateData(ByVal str As String)
 For i as integer = 0 to dataSet.Rows.Count -1
  If dataSet.Rows(i)(0).ToString = str Then
   dataSet.Rows(i)(0) = str
   Exit Sub
  End If
 Next
dataSet.Rows.Add(str)
End Sub

所以,我检查我是否已经有一个名为str 的行并覆盖。如果str 是新项目,我将其添加到dataSet。这是一个示例,不是我的实际代码,但我认为这应该说明我遇到的问题。 关于这个主题有很多问题,但我没有找到任何可行的解决方案。

【问题讨论】:

    标签: vb.net datagridview datatable


    【解决方案1】:

    在将DataRow 添加到DataTable 之后,当我执行Me.Refresh() 时,我设法获得了更好的结果。

    像这样:

    Public Sub UpdateData(ByVal str As String)
     For i as integer = 0 to dataSet.Rows.Count -1
      If dataSet.Rows(i)(0).ToString = str Then
       dataSet.Rows(i)(0) = str
       parent.RefreshForm()
       Exit Sub
      End If
     Next
    dataSet.Rows.Add(str)
    parent.RefreshForm()
    End Sub
    

    其中 parent 是 Form1。在 Form1 中,我现在有这个:

      Public Delegate Sub RefreshFormDelegate()
      Public Sub RefreshForm()
        If Me.InvokeRequired Then
          Me.Invoke(New RefreshFormDelegate(AddressOf RefreshForm))
          Return
        End If
        Me.Refresh()
      End Sub
    

    现在DataGridView 在我在DataTable 中添加/修改的每一行之后都会很好​​地更新。我不需要使用BindingSource。不管有没有BindingSource,都是一样的。

    但是现在仍然存在一个问题:我的DataGridView 已冻结,没有滚动条(就像应该有的那样),除非我先调整列大小或对列进行排序,否则我无法选择一行...很难解释,但是还是有问题!

    【讨论】:

      【解决方案2】:

      您的示例代码中有很多语法错误,我只能假设这是在这里编写的,而不是在 VB 中然后复制的。但是忽略它们,您的问题与作为网格数据源的数据表没有实现INotifyCollectionChanged 的事实有关,这意味着它不会告诉网格您添加了新行。正如您所说,您已经尝试过,您需要使用 ObservableCollection 或 BindingSource 之类的东西。

      知道你已经尝试过了,我只能假设你没有正确使用它。将网格的数据源设置为绑定源,然后在数据表中添加新行时,还必须将其添加到 BindingSource。

      希望这可以帮助您走上正确的道路。

      【讨论】:

      • 我尝试 1) 将 bsource 调暗为新的 BindingSource 2)DataGridViewProcesses.DataSource = bSource 3) 将 dataRow 调暗为 DataRow 4) 填充 dataRow! (检查,工作)5)dataSet.Rows.Add(dataRow)和bSource.Add(dataRow)。仍然以相同的方式工作。调整列或行的大小后,Datagridview 会自行更新。当我在调整大小后获得新数据时,DataGridView 会按照我的意愿进行自我更新。
      • 当我将 DataTable 绑定到 ChartControl 时,我使用相同的方法(在原始帖子中提到)并且它每次都会毫不费力地自我更新。
      • 您对 BindingSource 所做的操作看起来是正确的。编辑您的原始帖子并使用绑定源添加代码示例(包括方法和事件处理程序,以便我们获得完整的图片)。有时候,如果没有全貌,您就无法看到一些小事。
      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2011-08-22
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      相关资源
      最近更新 更多