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

学校项目:如何实现文本框数据存入数据库并在列表框展示?

解决你的学校项目数据存储与展示问题

嘿,我来帮你梳理下当前代码里的问题,然后一步步改成能正常运行的版本——你的核心需求是把输入的姓名性别存入数据库,同时在ListBox里实时展示最新数据,现在的代码主要有几个关键问题:

现存问题分析

  • 数据绑定与直接操作Items冲突:你在Form_Load里给ListBox设置了DataSource(绑定数据库表),但按钮点击事件里又直接调用lb_gebruikers.Items.Add(),这两种方式不能同时用,会导致ListBox展示混乱。
  • 没有真正写入数据库:当前按钮点击只是把对象加到内存的personen集合,重启程序后数据就丢了,完全没和数据库交互。
  • 循环添加逻辑错误:你的foreach循环里每次都添加同一个nieuwpersoon,还会重复添加所有已有的数据,导致ListBox内容重复堆积。

修改后的完整代码方案

第一步:先确保你的Persoon类与数据库表匹配

假设你的SQL数据库表Persoon结构是:Id(自增主键,int)、Naam(nvarchar)、Geslacht(nvarchar),对应的实体类:

public class Persoon
{
    public int Id { get; set; }
    public string Naam { get; set; }
    public string Geslacht { get; set; }

    public Persoon(string naam, string geslacht)
    {
        Naam = naam;
        Geslacht = geslacht;
    }

    // 数据绑定可能需要无参构造函数,加上更稳妥
    public Persoon() {}
}

第二步:窗体类的核心代码

先在窗体类里声明必要的字段,然后重写加载和按钮点击逻辑:

// 替换成你的数据库连接字符串
private string connectionString = "Server=你的服务器名;Database=你的数据库名;Trusted_Connection=True;";
private List<Persoon> personen = new List<Persoon>();

private void Form1_Load(object sender, EventArgs e)
{
    // 窗体加载时初始化ListBox数据
    LoadPersoonData();
}

// 抽离加载数据的方法,方便后续刷新调用
private void LoadPersoonData()
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        // 只查询需要的字段,比SELECT *更高效
        string query = "SELECT Id, Naam, Geslacht FROM Persoon";
        using (SqlDataAdapter adapter = new SqlDataAdapter(query, connection))
        {
            DataTable persoonTable = new DataTable();
            adapter.Fill(persoonTable);
            
            // 先清空旧的数据源,避免绑定冲突
            lb_gebruikers.DataSource = null;
            // 设置显示的字段和值成员
            lb_gebruikers.DisplayMember = "Naam";
            lb_gebruikers.ValueMember = "Id";
            // 绑定最新的数据库数据
            lb_gebruikers.DataSource = persoonTable;
        }
    }
}

private void button1_Click(object sender, EventArgs e)
{
    // 先做输入验证,避免空数据
    string naam = tb_naam.Text.Trim();
    string geslacht = tb_geslacht.Text.Trim();
    if (string.IsNullOrEmpty(naam) || string.IsNullOrEmpty(geslacht))
    {
        MessageBox.Show("请填写完整的姓名和性别哦!");
        return;
    }

    // 把数据写入数据库(用参数化查询防止SQL注入)
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        string insertQuery = "INSERT INTO Persoon (Naam, Geslacht) VALUES (@Naam, @Geslacht)";
        using (SqlCommand command = new SqlCommand(insertQuery, connection))
        {
            command.Parameters.AddWithValue("@Naam", naam);
            command.Parameters.AddWithValue("@Geslacht", geslacht);
            
            connection.Open();
            command.ExecuteNonQuery();
        }
    }

    // 刷新ListBox,重新从数据库加载最新数据
    LoadPersoonData();
    
    // 清空输入框,方便下一次输入
    tb_naam.Clear();
    tb_geslacht.Clear();
}

关键优化点说明

  1. 参数化查询:避免了SQL注入风险,这是数据库操作的最佳实践。
  2. 统一数据绑定:放弃直接操作Items,全程用DataSource绑定数据库表,保证数据展示的一致性。
  3. 抽离刷新方法:LoadPersoonData可以在添加、修改、删除数据后重复调用,确保ListBox始终展示最新的数据库状态。
  4. 输入验证:防止用户输入空数据,提升程序健壮性。

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:29:14