如何为点击按钮创建的新Form添加DataGridView?
实现点击按钮弹出带DataGridView的新Form
我来帮你完善这段代码,让点击指定列时弹出的新Form能正确显示带过滤数据的DataGridView。这里是调整后的完整代码,加上了关键的布局和控件添加逻辑:
if (e.ColumnIndex == dataGridView1.Columns[16].Index && e.RowIndex >= 0) { int numberRow = e.RowIndex; // e.RowIndex本身就是int类型,无需额外转换 var form2 = new Form(); form2.Text = "历史记录详情"; // 给窗口设置清晰的标题 form2.Size = new Size(800, 600); // 预设窗口大小,也可以加一句`form2.StartPosition = FormStartPosition.CenterScreen;`让窗口居中显示 // 创建DataGridView并配置基础属性 var historygridview = new DataGridView(); historygridview.Dock = DockStyle.Fill; // 让DataGridView自动填满整个窗口,适配窗口大小变化 historygridview.AutoGenerateColumns = true; // 自动根据数据源生成列(如果需要自定义列可设为false) historygridview.ReadOnly = true; // 设置为只读,避免用户误编辑历史数据 historygridview.AllowUserToAddRows = false; // 隐藏底部自动生成的空行 historygridview.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 让列自动填充窗口宽度 // 处理数据源与过滤逻辑 var dt = sIMSDataSet.History; // 处理单元格空值,避免空引用异常 string SMNumber = dataGridView1.Rows[numberRow].Cells[3].Value?.ToString() ?? string.Empty; // 转义单引号,防止RowFilter语法报错(如果SM编号里包含单引号) string safeSMNumber = SMNumber.Replace("'", "''"); var dv = new DataView(dt) { RowFilter = $"SM = '{safeSMNumber}'" }; // 绑定数据源到DataGridView historygridview.DataSource = dv; // 关键步骤:将DataGridView添加到Form的控件集合,否则控件不会显示在窗口上 form2.Controls.Add(historygridview); form2.Show(); }
关键细节说明:
- 控件显示核心:必须通过
form2.Controls.Add(historygridview)把DataGridView加入Form的控件集合,这是新手容易遗漏的点,不加的话控件只会在内存中创建,不会显示在窗口上。 - 布局优化:用
Dock = DockStyle.Fill替代手动设置Location和Size,让表格自动适配窗口大小,体验更流畅。 - 数据安全与容错:处理了单元格空值和单引号转义,避免运行时出现空引用或语法错误。
- 用户体验优化:设置只读、隐藏空行等属性,让历史记录表格更符合查看场景的需求。
如果需要自定义列(比如修改列标题、调整列宽或顺序),可以把AutoGenerateColumns设为false,手动添加列,示例:
historygridview.AutoGenerateColumns = false; // 添加自定义列 historygridview.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "SM", // 对应数据源的列名 HeaderText = "SM编号", // 显示的列标题 Width = 150 }); // 继续添加其他需要的列...
内容的提问来源于stack exchange,提问作者James Morrish
相关产品推荐
相关产品推荐

