仅在我调整列或行的大小后,DataGridView才会首次更新自身

时间:2013-10-11 12:21:15

标签: vb.net datagridview datatable

我试图找到解决方案,所以请先检查您的问题! 我在BindingSourceDataGridView之间尝试DataTable但没有用。 我尝试在每个循环后将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。这是一个例子,不是我的实际代码,但我认为这应该证明我有问题。 关于这个主题有很多问题,但我找不到任何可行的解决方案。

2 个答案:

答案 0 :(得分:1)

我在向Me.Refresh()添加DataRowDataTable进行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 后,设法得到了更好的结果。

像这样:

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

父母是Form1。在Form1中,我现在有了这个:

DataGridView

现在DataTableBindingSource中添加/修改的每一行之后都很好地更新了。我不需要使用BindingSource。它是相同的,有或没有DataGridView

但是现在仍然存在一个问题:我的{{1}}是FROZEN,没有滚动条(就像应该这样)而且我不能选择一行,除非我先调整大小或排序COLUMNS ...很难解释但它仍然是一个问题!

答案 1 :(得分:0)

你的示例代码中有很多语法错误,我只能假设这是在这里写的,而不是在VB中然后复制。但忽略它们,您的问题与数据表(您的网格的数据源)没有实现INotifyCollectionChanged这一事实有关,这意味着它不会告诉网格您添加了新行。您需要使用类似ObservableCollection或BindingSource的内容,正如您所说的那样。

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

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