You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:52:40