vb.net - 为什么序列号在 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
出现序列号,但是当我单击下一列时,它消失了。为什么会这样?
解决方案
这样做,让生活变得轻松:
抛弃所有代码
制作一个新表格
将 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
推荐阅读
- node.js - 由于 Oracle NOSql 的更多 Open 连接导致 CPU 使用率高的问题
- reactjs - 如何在 React 中 2 秒内隐藏元素
- google-chrome-extension - Chrome 扩展(从后台到其他 js 的消息):无法建立连接。接收端不存在
- javascript - 当另一个音频开始时停止播放音频
- plotly - Plotly 带有虚线或虚线边框的条形图 - 如何实现?
- python - anaconda 上没有出现虚拟环境
- azure - 如何使用 Azure Logic App 将 Http API 响应插入 SQL DB
- javascript - 捕获权限错误问题 discord.js?
- python - 带有数据框的 Python 条形图
- java - 如何在从 JSON 字符串序列化时将杰克逊对象设为可选