Datagridview操作

本文介绍如何使用Visual Basic .NET动态创建DataGridView控件,并详细说明了设置各列属性的方法,包括列头显示文字、数据对齐方式、列宽、只读状态等。

<think>我们正在讨论DataGridView的常见操作和使用方法。根据引用内容,我们可以总结一些关键点: 1. 事件处理:如CellClick, CellDoubleClick, UserDeletingRow等事件(引用[1])。 2. 控制新行显示:通过设置AllowUserToAddRows属性(引用[2])。 3. 数据刷新:使用EndEdit和Refresh方法确保数据更新显示(引用[3])。 4. 动态添加序号:在每列前添加序号列(引用[3])。 接下来,我们将详细说明这些常见操作,并提供代码示例(使用C#语言)。 ### 1. 事件处理 DataGridView提供了多种事件,用于响应用户操作。以下是一些常用事件: - **CellClick**:当用户单击单元格时触发。 - **CellDoubleClick**:当用户双击单元格时触发。 - **UserDeletingRow**:当用户删除行之前触发。 例如,处理CellClick事件获取点击的行和列索引: ```csharp private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { // e.RowIndex 和 e.ColumnIndex 分别表示行和列的索引 if (e.RowIndex >= 0 && e.ColumnIndex >= 0) // 确保不是点击的标题行 { DataGridViewCell cell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; // 执行操作,例如显示单元格值 MessageBox.Show(cell.Value.ToString()); } } ``` ### 2. 禁止显示新行 默认情况下,DataGridView底部会显示一个用于添加新行的空行。若要隐藏该行,可将`AllowUserToAddRows`属性设置为`false`: ```csharp dataGridView1.AllowUserToAddRows = false; ``` ### 3. 数据刷新 在修改数据后,可能需要调用`EndEdit`和`Refresh`方法以确保界面更新: ```csharp // 修改单元格后 dataGridView1.EndEdit(); // 结束编辑状态 dataGridView1.Refresh(); // 刷新控件显示 ``` ### 4. 动态添加序号列 在绑定数据后,可以在每行前添加一个序号列。通常,我们可以在`RowsAdded`事件中处理: ```csharp private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) { for (int i = 0; i < dataGridView1.Rows.Count; i++) { dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString(); } } ``` 或者,在绑定数据后直接遍历行设置行头: ```csharp // 绑定数据后 dataGridView1.DataSource = myDataTable; // 添加序号 for (int i = 0; i < dataGridView1.Rows.Count; i++) { dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString(); } // 调整行头宽度以适应序号 dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders; ``` ### 其他常见操作 #### 绑定数据源 DataGridView通常通过绑定数据源(如DataTable)显示数据: ```csharp DataTable dt = new DataTable(); // 添加列 dt.Columns.Add("ID", typeof(int)); dt.Columns.Add("Name", typeof(string)); // 添加数据 dt.Rows.Add(1, "John"); dt.Rows.Add(2, "Alice"); dataGridView1.DataSource = dt; ``` #### 获取选中行 ```csharp if (dataGridView1.SelectedRows.Count > 0) { DataGridViewRow selectedRow = dataGridView1.SelectedRows[0]; // 获取第一列的值 object value = selectedRow.Cells[0].Value; } ``` #### 设置只读 ```csharp dataGridView1.ReadOnly = true; // 整个DataGridView只读 // 或者设置某一列只读 dataGridView1.Columns["ColumnName"].ReadOnly = true; ``` #### 调整列宽 ```csharp // 自动调整列宽 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; ``` #### 添加行 ```csharp // 添加一行数据 dataGridView1.Rows.Add("3", "Bob"); ``` #### 删除行 ```csharp // 删除选中行 foreach (DataGridViewRow row in dataGridView1.SelectedRows) { if (!row.IsNewRow) // 避免删除新行(如果允许添加新行) dataGridView1.Rows.Remove(row); } ``` ### 注意事项 - 当数据量较大时,频繁刷新可能导致性能问题,可考虑使用`SuspendLayout`和`ResumeLayout`方法。 - 在修改数据源后,如果DataGridView未更新,检查是否绑定了BindingSource,并调用`ResetBindings`方法。 以上是DataGridView的一些常见操作和使用方法,涵盖了事件处理、数据显示控制、数据刷新、序号添加等。 §§相关问题§§ 1. 如何实现DataGridView的单元格编辑验证? 2. 如何在DataGridView中实现多列排序? 3. DataGridView如何绑定到自定义对象集合?</think>### DataGridView常见操作与使用方法 #### 1. **数据绑定与显示** ```csharp // 绑定DataTable DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Rows.Add(1, "张三"); dt.Rows.Add(2, "李四"); dataGridView1.DataSource = dt; // 绑定数据源 // 绑定对象列表 List<User> users = new List<User> { new User(1, "张三"), new User(2, "李四") }; dataGridView1.DataSource = users; ``` #### 2. **行列控制** ```csharp // 隐藏列 dataGridView1.Columns["ID"].Visible = false; // 添加新列(如序号列) DataGridViewTextBoxColumn colIndex = new DataGridViewTextBoxColumn(); colIndex.HeaderText = "序号"; colIndex.ReadOnly = true; dataGridView1.Columns.Insert(0, colIndex); // 禁止添加新行(隐藏底部空行) dataGridView1.AllowUserToAddRows = false; // 引用[2] // 设置行高 dataGridView1.RowTemplate.Height = 30; ``` #### 3. **事件处理** ```csharp // 单元格点击事件 private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex >= 0) { string value = dataGridView1.Rows[e.RowIndex].Cells["Name"].Value.ToString(); MessageBox.Show($"选中: {value}"); } } // 引用[1] // 行删除事件 private void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e) { if (MessageBox.Show("确认删除?", "提示", MessageBoxButtons.YesNo) == DialogResult.No) { e.Cancel = true; // 取消删除 } } // 引用[1] ``` #### 4. **数据操作** ```csharp // 获取选中行数据 if (dataGridView1.SelectedRows.Count > 0) { DataGridViewRow row = dataGridView1.SelectedRows[0]; int id = Convert.ToInt32(row.Cells["ID"].Value); } // 手动添加行 dataGridView1.Rows.Add(3, "王五"); // 刷新数据 dataGridView1.EndEdit(); // 结束编辑状态 dataGridView1.Refresh(); // 强制刷新显示 引用[3] ``` #### 5. **样式设置** ```csharp // 设置交替行颜色 dataGridView1.RowsDefaultCellStyle.BackColor = Color.White; dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray; // 冻结列(左侧固定列) dataGridView1.Columns["Name"].Frozen = true; // 自动调整列宽 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; ``` #### 6. **验证与错误处理** ```csharp // 单元格验证 private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { if (e.ColumnIndex == 1) // Name列 { if (string.IsNullOrWhiteSpace(e.FormattedValue.ToString())) { MessageBox.Show("姓名不能为空"); e.Cancel = true; // 阻止离开单元格 } } } ``` ### 常见问题解决方案 1. **数据不刷新** ```csharp dataGridView1.EndEdit(); // 提交编辑 dataGridView1.Refresh(); // 强制刷新 引用[3] ``` 2. **动态添加序号列** ```csharp private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { // 在行头显示序号 e.Graphics.DrawString((e.RowIndex + 1).ToString(), this.Font, Brushes.Black, e.RowBounds.Location.X + 10, e.RowBounds.Location.Y + 4); } // 引用[3] ``` 3. **禁止用户排序** ```csharp foreach (DataGridViewColumn col in dataGridView1.Columns) { col.SortMode = DataGridViewColumnSortMode.NotSortable; } ``` > **最佳实践**:对大数据量操作时使用`SuspendLayout()`和`ResumeLayout()`提升性能: > ```csharp > dataGridView1.SuspendLayout(); > // 批量操作代码... > dataGridView1.ResumeLayout(); > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值