WinForms中列表添加项及DataGridView展示问题求助
问题分析与修复方案
先梳理下你代码里的核心问题:
- 你用
boatOne、boatTwo这类单个变量存储Fleet对象,而非集合(比如List<Fleet>),每次点击提交都会覆盖之前的对象,自然没法实现数据追加。 - 每次点击按钮都新建
tempTextBox列表,还重复添加了两次BoatNameTextBox.Text,属于冗余操作。 - 生成DataTable时直接把
boatThree、boatFour对象塞进去,没有提取属性,导致DataGridView显示异常。 - 提交后给文本框重新赋值为
boatOne的属性,这步完全没必要,反而干扰了输入后的清空逻辑。
修复步骤与代码示例
1. 替换单个变量为集合
首先在窗体类中,把单个的Fleet变量换成一个全局的List<Fleet>集合,这样每次提交都能追加新对象:
// 替换原来的boatOne、boatTwo等单个变量 private List<Fleet> boatFleet = new List<Fleet>();
2. 重构提交按钮的点击事件
简化BoatSubmitButton_Click方法,专注于收集输入、添加到集合、更新DataGridView:
private void BoatSubmitButton_Click(object sender, EventArgs e) { // 1. 获取并清理用户输入 string boatName = BoatNameTextBox.Text.Trim(); string licenseNumber = BoatLicenseTextBox.Text.Trim(); string maxLoad = MaximumLoadTextBox.Text.Trim(); // 可选:添加基础输入校验,避免空数据 if (string.IsNullOrEmpty(boatName) || string.IsNullOrEmpty(licenseNumber) || string.IsNullOrEmpty(maxLoad)) { MessageBox.Show("请填写完整的船只信息!"); return; } // 2. 创建Fleet对象并追加到集合 Fleet newBoat = new Fleet(boatName, licenseNumber, maxLoad); boatFleet.Add(newBoat); // 3. 清空输入框 BoatNameTextBox.Text = ""; BoatLicenseTextBox.Text = ""; MaximumLoadTextBox.Text = ""; // 4. 更新DataGridView展示 UpdateBoatDataGridView(); }
3. 抽离DataGridView更新逻辑
把DataGridView的绑定和样式设置单独写成方法,提升代码复用性:
private void UpdateBoatDataGridView() { DataTable dt = new DataTable(); dt.Columns.Add("Boat Name"); dt.Columns.Add("License Number"); dt.Columns.Add("Maximum Load"); // 遍历集合,将每个Fleet对象的属性添加到DataTable foreach (var boat in boatFleet) { dt.Rows.Add(boat.GetboatName(), boat.GetboatLicense(), boat.GetmaximumLoad()); } // 绑定数据源并设置样式 BoatDataGridView.DataSource = dt; BoatDataGridView.CellBorderStyle = DataGridViewCellBorderStyle.None; BoatDataGridView.RowHeadersVisible = false; BoatDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; // 若FishDataGridView与船只数据无关,建议将其样式设置移到对应逻辑中 // FishDataGridView.AutoResizeColumns(); // FishDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; }
额外优化建议
如果你的Fleet类可以把属性改成公共可读属性,绑定DataGridView会更简洁,不用依赖GetboatName()这类方法。示例Fleet类:
public class Fleet { public string BoatName { get; } public string LicenseNumber { get; } public string MaximumLoad { get; } public Fleet(string boatName, string licenseNumber, string maximumLoad) { BoatName = boatName; LicenseNumber = licenseNumber; MaximumLoad = maximumLoad; } }
此时UpdateBoatDataGridView方法可以直接绑定集合,无需手动创建DataTable:
private void UpdateBoatDataGridView() { BoatDataGridView.DataSource = null; // 先清空旧数据源 BoatDataGridView.DataSource = boatFleet; // 自定义列显示名称 BoatDataGridView.Columns["BoatName"].HeaderText = "Boat Name"; BoatDataGridView.Columns["LicenseNumber"].HeaderText = "License Number"; BoatDataGridView.Columns["MaximumLoad"].HeaderText = "Maximum Load"; // 样式设置 BoatDataGridView.CellBorderStyle = DataGridViewCellBorderStyle.None; BoatDataGridView.RowHeadersVisible = false; BoatDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; }
这样修改后,每次点击提交按钮,新的船只信息都会追加到集合中,DataGridView也会正确展示所有Fleet对象了!
内容的提问来源于stack exchange,提问作者Gentian Gashi
相关产品推荐
相关产品推荐

