选择另一个控件时,datagridview 中的新行默认值消失
New row default values from datagridview dissappear when another control is selected
这是我的第一个问题,请多多包涵。
目的:
我想要完成的是允许用户在 Windows Forms 应用程序中编辑来自 DataGridView(绑定到自定义 class 的对象列表)的行。此外,当在 DataGridView 中生成新行时,我需要提供一些默认值,我正在使用 DataGridView 中的 DefaultValuesNeeded 事件处理程序实现这些值。
问题:
编辑行时,用户必须能够导航到 DataGridView 外部(例如,导航到 TextBox 以提供额外信息),但如果用户在编辑前离开新行,默认值将从行中消失。这是我需要避免的。如果用户编辑新行的任何单元格,然后单击表单中的其他位置,则该行中的所有值都保留在那里,这是正确的并且是所需的行为。
我创建了一个小项目来说明这一点。
表格:
Imports System.ComponentModel
Public Class Form1
Private Sub dgvAsientos_DefaultValuesNeeded(sender As Object, e As Windows.Forms.DataGridViewRowEventArgs) Handles DataGridView1.DefaultValuesNeeded
e.Row.Cells("ID").Value = Me.DataGridView1.Rows.Count
e.Row.Cells("Name").Value = "Test Name " & Me.DataGridView1.Rows.Count
e.Row.Cells("Description").Value = "Description " & Me.TextBox1.Text & " " & Me.DataGridView1.Rows.Count
Me.DataGridView1.BindingContext(Me.DataGridView1.DataSource, Me.DataGridView1.DataMember).EndCurrentEdit()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim myList As New BindingList(Of ExampleClass)
For n = 0 To 5
Dim itemn As New ExampleClass
itemn.ID = n
itemn.Name = "Name_" & n
itemn.Description = "Description_" & n
itemn.OptionalField = "OptionalField_" & n
myList.Add(itemn)
Next
Dim bs As New BindingSource()
bs.DataSource = myList
Me.DataGridView1.DataSource = bs
End Sub
End Class
示例class:
Public Class ExampleClass
Public Property ID As Integer
Public Property Name As String
Public Property Description As String
Public Property OptionalField As String
End Class
如有任何帮助,我们将不胜感激。我发现关于 DefaultValuesNeeded + BindingSources + 用户聚焦其他控件时丢失的值的信息很少;他们中的一些人让我在一行之后添加一行,但我没有发现这有什么不同。
(...).EndCurrentEdit()
我还发现了为绑定源 AddingNew 事件添加处理程序的建议,该事件返回具有我需要的默认值的对象实例,同样没有区别。
Private Sub myBindingSource_AddingNew(sender As Object, e As AddingNewEventArgs)
e.NewObject = CreateNewExample()
End Sub
希望问题和格式是正确的。提前致谢,
MBD
当用户通过导航到最后一行然后在编辑单元格之前离开该行在 DataGridView 中添加新行时;在这种情况下,添加行将被取消。这是因为一些 internal logic 在行不脏时取消新行。
要更改此行为,您可以处理 RowValidating or RowLeave events, then notify the current cell is dirty, and then end the current edit。
C# 示例
private void dgv1_RowLeave(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == dgv1.NewRowIndex)
{
dgv1.NotifyCurrentCellDirty(true);
dgv1.BindingContext[dgv1.DataSource, dgv1.DataMember].EndCurrentEdit();
dgv1.NotifyCurrentCellDirty(false);
}
}
VB.NET 示例
Private Sub dgv1_RowLeave(sender As Object, e As DataGridViewCellEventArgs) _
Handles dgv1.RowLeave
If e.RowIndex = dgv1.NewRowIndex Then
dgv1.NotifyCurrentCellDirty(True)
dgv1.BindingContext(dgv1.DataSource, dgv1.DataMember).EndCurrentEdit()
dgv1.NotifyCurrentCellDirty(False)
End If
End Sub
这是我的第一个问题,请多多包涵。
目的:
我想要完成的是允许用户在 Windows Forms 应用程序中编辑来自 DataGridView(绑定到自定义 class 的对象列表)的行。此外,当在 DataGridView 中生成新行时,我需要提供一些默认值,我正在使用 DataGridView 中的 DefaultValuesNeeded 事件处理程序实现这些值。
问题: 编辑行时,用户必须能够导航到 DataGridView 外部(例如,导航到 TextBox 以提供额外信息),但如果用户在编辑前离开新行,默认值将从行中消失。这是我需要避免的。如果用户编辑新行的任何单元格,然后单击表单中的其他位置,则该行中的所有值都保留在那里,这是正确的并且是所需的行为。
我创建了一个小项目来说明这一点。 表格:
Imports System.ComponentModel
Public Class Form1
Private Sub dgvAsientos_DefaultValuesNeeded(sender As Object, e As Windows.Forms.DataGridViewRowEventArgs) Handles DataGridView1.DefaultValuesNeeded
e.Row.Cells("ID").Value = Me.DataGridView1.Rows.Count
e.Row.Cells("Name").Value = "Test Name " & Me.DataGridView1.Rows.Count
e.Row.Cells("Description").Value = "Description " & Me.TextBox1.Text & " " & Me.DataGridView1.Rows.Count
Me.DataGridView1.BindingContext(Me.DataGridView1.DataSource, Me.DataGridView1.DataMember).EndCurrentEdit()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim myList As New BindingList(Of ExampleClass)
For n = 0 To 5
Dim itemn As New ExampleClass
itemn.ID = n
itemn.Name = "Name_" & n
itemn.Description = "Description_" & n
itemn.OptionalField = "OptionalField_" & n
myList.Add(itemn)
Next
Dim bs As New BindingSource()
bs.DataSource = myList
Me.DataGridView1.DataSource = bs
End Sub
End Class
示例class:
Public Class ExampleClass
Public Property ID As Integer
Public Property Name As String
Public Property Description As String
Public Property OptionalField As String
End Class
如有任何帮助,我们将不胜感激。我发现关于 DefaultValuesNeeded + BindingSources + 用户聚焦其他控件时丢失的值的信息很少;他们中的一些人让我在一行之后添加一行,但我没有发现这有什么不同。
(...).EndCurrentEdit()
我还发现了为绑定源 AddingNew 事件添加处理程序的建议,该事件返回具有我需要的默认值的对象实例,同样没有区别。
Private Sub myBindingSource_AddingNew(sender As Object, e As AddingNewEventArgs)
e.NewObject = CreateNewExample()
End Sub
希望问题和格式是正确的。提前致谢, MBD
当用户通过导航到最后一行然后在编辑单元格之前离开该行在 DataGridView 中添加新行时;在这种情况下,添加行将被取消。这是因为一些 internal logic 在行不脏时取消新行。
要更改此行为,您可以处理 RowValidating or RowLeave events, then notify the current cell is dirty, and then end the current edit。
C# 示例
private void dgv1_RowLeave(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == dgv1.NewRowIndex)
{
dgv1.NotifyCurrentCellDirty(true);
dgv1.BindingContext[dgv1.DataSource, dgv1.DataMember].EndCurrentEdit();
dgv1.NotifyCurrentCellDirty(false);
}
}
VB.NET 示例
Private Sub dgv1_RowLeave(sender As Object, e As DataGridViewCellEventArgs) _
Handles dgv1.RowLeave
If e.RowIndex = dgv1.NewRowIndex Then
dgv1.NotifyCurrentCellDirty(True)
dgv1.BindingContext(dgv1.DataSource, dgv1.DataMember).EndCurrentEdit()
dgv1.NotifyCurrentCellDirty(False)
End If
End Sub