我试图找到解决方案,所以请先检查您的问题!
我在BindingSource
和DataGridView
之间尝试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
。这是一个例子,不是我的实际代码,但我认为这应该证明我有问题。
关于这个主题有很多问题,但我找不到任何可行的解决方案。
答案 0 :(得分:1)
我在向Me.Refresh()
添加DataRow
后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
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
现在DataTable
在BindingSource
中添加/修改的每一行之后都很好地更新了。我不需要使用BindingSource
。它是相同的,有或没有DataGridView
。
但是现在仍然存在一个问题:我的{{1}}是FROZEN,没有滚动条(就像应该这样)而且我不能选择一行,除非我先调整大小或排序COLUMNS ...很难解释但它仍然是一个问题!
答案 1 :(得分:0)
你的示例代码中有很多语法错误,我只能假设这是在这里写的,而不是在VB中然后复制。但忽略它们,您的问题与数据表(您的网格的数据源)没有实现INotifyCollectionChanged这一事实有关,这意味着它不会告诉网格您添加了新行。您需要使用类似ObservableCollection或BindingSource的内容,正如您所说的那样。
知道你曾经尝试过,我只能假设你没有正确使用它。将网格的数据源设置为bindingsource,然后在数据表中添加新行时,还必须将其添加到BindingSource。
希望这可以帮助你走正确的道路。