Winform中的dataGridView添加自动编号

新建一个WinForm项目,在工具栏里拖一个dataGriView到窗体中,默认名称为dataGridView1,把数据源添加到dataGridView1中,运行,看到dataGriView1有数据显示,但没有行编号,所以我们需要添加一列,用来显示行号,以便我们知道这是第几条记录。选中dataGriView1,然后在属性列表的事件选择RowPostPaint事件,双击后添加事件处理函数,代码如下:

privatevoid dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
    //自动编号,与数据无关
    Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, 
       e.RowBounds.Location.Y, 
       dataGridView1.RowHeadersWidth - 4, 
       e.RowBounds.Height);
    TextRenderer.DrawText(e.Graphics, 
          (e.RowIndex + 1).ToString(), 
           dataGridView1.RowHeadersDefaultCellStyle.Font, 
           rectangle, 
           dataGridView1.RowHeadersDefaultCellStyle.ForeColor, 
           TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
}

再次运行程序,就能看到多了一个标题列,显示数据的行号!!嘻嘻。。。


### 关于WinForms DataGridView 控件的使用方法 #### 创建和初始化DataGridView控件 为了在Windows Forms应用程序中展示数据,通常会在窗体设计器里拖拽一个`DataGridView`控件到窗体上。如果希望程序启动时加载特定的数据集,则可以在窗体的`Load`事件处理函数内完成相应的配置工作。 ```csharp private void Form1_Load(object sender, EventArgs e) { // 初始化DataGridViewComboBoxColumn类型的列,并向其中添加项 var colShow = new DataGridViewComboBoxColumn(); colShow.Items.Add("选项一"); colShow.Items.Add("选项二"); // 插入新创建的选择框列为第一个可见列 dataGridView1.Columns.Insert(0, colShow); } ``` 此段代码展示了如何动态地往`DataGridView`组件里面加入下拉菜单形式的新字段[^2]。 #### 绑定数据源至DataGridView 当涉及到将外部数据源连接到`DataGridView`以便直观查看记录的时候,可以采用如下方式: ```csharp public class MainForm : Form { public TablesContext db; public BindingList<GwKey> dsTable1 { get; set; } private void button_table1_Click(object sender, EventArgs e) { // 清除现有数据显示前先清空旧有的绑定关系以及移除所有已存在的列定义 dataGridView1.DataSource = null; dataGridView1.Columns.Clear(); // 加载来自数据库中的最新数据,并转换成适合用于UI层显示的形式 db.Table1.Load(); dsTable1 = db.Table1.Local.ToBindingList(); // 设置新的数据源给dataGridView1,此时它会依据dsTable1的内容自动生成对应的行与列结构 dataGridView1.DataSource = dsTable1; } } ``` 上述例子说明了怎样利用Entity Framework Core来获取存储于数据库里的信息,并通过`BindingList<T>`作为中介传递给`DataGridView`进行可视化渲染[^3]。 #### 自动调整列宽和其他样式定制化操作 为了让界面更加友好美观,在某些情况下可能还需要对各列宽度做适当调节或是应用其他外观上的优化措施。这可以通过为模型类成员变量附加特殊的属性标签达成目的。 ```csharp using System.ComponentModel.DataAnnotations; // 定义实体类及其属性装饰器 public class Employee { [Display(Name="员工编号")] [ColumnStyle( Name = "EmployeeID", HeaderText = "工号", DisplayIndex = 0, Width = 80, DataPropertyName = "EmployeeID", ColumnType = ColumnStyleEnum.TextBoxColumn)] public int EmployeeID {get;set;} ... } ``` 这里介绍了通过声明式的编程风格指定每列的具体表现特征的方法[^4]。 #### 提升用户体验的小贴士 最后值得一提的是有关键盘导航方面的改进建议——即允许用户按下Tab键后光标能够按照从左至右顺序移动到下一个可编辑单元格位置的功能实现思路。 ```csharp protected override bool ProcessCmdKey(ref Message msg, Keys keyData){ if (keyData == Keys.Tab && this.ActiveControl is DataGridView dgv){ int currentIndex = dgv.CurrentCell.ColumnIndex + 1; if(currentIndex >= dgv.Columns.Count){ currentIndex = 0; } dgv.CurrentCell = dgv.Rows[dgv.CurrentCell.RowIndex].Cells[currentIndex]; return true; } return base.ProcessCmdKey(ref msg, keyData); } ``` 这段重写的`ProcessCmdKey()`方法实现了更流畅自然的方向切换逻辑[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值