首页 > 解决方案 > 为什么序列号在 DataGridView 中消失了?

问题描述

我正在使用以下代码在 DataGridView 中生成自动序列号:

Public Class Form1

    Dim table As New DataTable()
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


        table.Columns.Add("Sl", Type.GetType("System.Int32"))
        table.Columns.Add("Id", Type.GetType("System.Int32"))
        table.Columns.Add("Name", Type.GetType("System.String"))
        table.Columns.Add("Amount", Type.GetType("System.Int32"))


        DataGridView1.DataSource = table
        DataGridView1.Columns(0).ReadOnly = True
        DataGridView1.Columns(2).ReadOnly = True
    End Sub

    Private Sub DgvRowCountChanged()
        For Each dgvr As DataGridViewRow In Me.DataGridView1.Rows
            dgvr.Cells(0).Value = dgvr.Index + 1
        Next
    End Sub

    Private Sub DataGridView1_RowsAdded(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded
        Me.DgvRowCountChanged()
    End Sub

    Private Sub DataGridView1_RowsRemoved(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewRowsRemovedEventArgs) Handles DataGridView1.RowsRemoved
        Me.DgvRowCountChanged()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim Index As Integer
        
    If DataGridView1.RowCount > 1 Then
        Index = DataGridView1.CurrentCell.RowIndex
        DataGridView1.Rows.RemoveAt(Index)
        End If
    End Sub
End Class

出现序列号,但是当我单击下一列时,它消失了。为什么会这样?

标签: vb.netvisual-studiodatagridview

解决方案


这样做,让生活变得轻松:

  • 抛弃所有代码

  • 制作一个新表格

  • 将 DataSet 类型的新项添加到您的项目中,并给它起一个好听的名称(不是 DataSet1)

  • 双击数据集,出现其设计图面

  • 右击surface,选择“Add new.. DataTable”,给它起一个比DataTable1更有想象力的名字。我假设您选择许可证(序列号?名称?似乎是许可证)

  • 右键单击新数据表并选择“添加新..列”

  • 将新列命名为 Sl,并使用属性网格为其指定 System.Int32 类型

  • 重复其他列

  • 节省

  • 打开视图菜单上的数据源窗口(其他窗口项)

  • 打开您在第 2 步中创建的新空白表格

  • 展开您可以在“数据源”窗口中看到的每个节点

  • 将代表您的数据表的节点(旁边有一个看起来像 datagridview 的图标的节点)从数据源窗口中拖出并将其放在表单上

  • 删除(删除)它创建的绑定导航器(你不需要它)

  • 点击datagridview,点击控件右上角出现的小箭头显示弹出菜单,选择Edit Columns

  • 将您想要的任何列设为只读

  • 设置其他属性,如列大小、填充权重、标题文本等

  • 打开表单的代码。在 initializecomponent() 调用之后,在构造函数中向数据表添加单行数据:

    Me.myImaginativeDataSetName.License.AddLicenseRow(1, 1, "Name Blah", 1234)

就是这样。看起来很多,因为我已将其逐步分解为绝对值-唯一不存在的就是提醒您每隔几步呼吸一次,因为您会被它变得如此简单而震惊当您让 IDE 为您编写代码时,您的生活,;)

好吧,这可能没那么令人兴奋...但是您已经使用表单设计器为您编写了大量代码,所以这就是您利用其他工具的方式,因此您不必一直使用无类型数据集. 啊。

这创建的数据集具有一整套命名良好的属性;不要再使用基本的粘稠的东西:

'yes - do this
For Each ro as LicenseRow in myDataSet.License
  If ro.IsNameNull Then ro.Name = "Default Name" & ro.Sl
Next ro

'no - heck no
For Each ro as DataRow in myDataSet.Tables("License").Rows
  If ro.IsNull("Naem") Then ro.item("Name") = "Default Name" & Convert.ToInt32(ro.Item("Sl"))
Next ro    

看看第一个有多干净?ro.Sl 是一个很好的整数属性,没有强制转换或转换,没有连续的表或列/行,Intellisense 可以帮助你,因为它都是强命名的东西,字符串列名中没有像我在第二个中所做的拼写错误......


看起来您正试图阻止用户添加行:

If DataGridView1.RowCount > 1 Then
    Index = DataGridView1.CurrentCell.RowIndex
    DataGridView1.Rows.RemoveAt(Index)
    End If
End Sub

如果是这样,请单击表单设计器上的 datagridview 并在属性网格中设置AllowUserToAddRows为 false。如果您还试图阻止删除设置相同AllowUserToDeleteRows


推荐阅读