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

如何用C#、Linq-to-SQL将WinForm多行动态文本框值插入SQL Server

解决WinForms动态控件批量插入SQL Server的问题

你的问题核心在于每次添加控件时都覆盖了单个控件变量,导致保存时只能获取最后一行的数据。我们需要把每一行的控件(4个文本框+1个下拉框)分组存储,然后遍历所有组来批量插入数据。下面是具体的修改方案:

1. 创建控件组封装类

首先定义一个类来对应每一行的所有控件,方便后续批量处理:

public class ControlGroup
{
    public TextBox SnoTextBox { get; set; }
    public TextBox IdTextBox { get; set; }
    public TextBox NameTextBox { get; set; }
    public TextBox DesignationTextBox { get; set; }
    public ComboBox AttendanceComboBox { get; set; }
}

2. 在窗体中添加控件组集合

在Form1类里添加一个List来保存所有动态生成的控件组,替换原来的单个控件变量:

public partial class Form1 : Form 
{
    // 替换原来的单个tb1、tb2等变量,改为存储所有控件组的集合
    private List<ControlGroup> _controlGroups = new List<ControlGroup>();
    int lbltext = 1;
    int A = 1;
    int i = 0;
    int j = 0;

    // ... 其他原有代码
}

3. 修改控件生成逻辑(Show方法)

每次生成一组控件后,把它们添加到控件组集合中,而不是覆盖单个变量:

internal new void Show()
{
    i++;
    var tb1 = new TextBox() { Text = (lbltext).ToString() + ".", Height = 22, Width = 17, Left = 9, Top = 140 + A * 36, Name = "textbox" + i };
    i++;
    var tb2 = new TextBox { Height = 22, Width = 60, Left = 43, Top = 140 + A * 36, Name = "textbox" + i };
    i++;
    var tb3 = new TextBox { Height = 22, Width = 64, Left = 122, Top = 140 + A * 36, Name = "textbox" + i };
    i++;
    var tb4 = new TextBox { Height = 22, Width = 80, Left = 220, Top = 140 + A * 36, Name = "textbox" + i };
    j++;
    var cm = new ComboBox();
    cm.Text = "-NONE-";
    cm.Items.Add("-PRESENT-");
    cm.Items.Add("-LEAVE-");
    cm.Items.Add("-HOLIDAY-");
    cm.Left = 358;
    cm.Width = 92;
    cm.Height = 22;
    cm.Name = "ComBoBox" + j;
    cm.Top = 140 + A * 36;

    // 将当前组的控件添加到集合
    _controlGroups.Add(new ControlGroup
    {
        SnoTextBox = tb1,
        IdTextBox = tb2,
        NameTextBox = tb3,
        DesignationTextBox = tb4,
        AttendanceComboBox = cm
    });

    this.Controls.Add(tb1);
    this.Controls.Add(tb2);
    this.Controls.Add(tb3);
    this.Controls.Add(tb4);
    this.Controls.Add(cm);
}

4. 修改保存按钮逻辑,实现批量插入

遍历控件组集合,批量创建数据库实体,最后一次性提交更改(避免多次SubmitChanges影响效率):

internal void Button2_Click(object sender, EventArgs e)
{
    ExampleDataContext dc = new ExampleDataContext();
    try
    {
        foreach (var group in _controlGroups)
        {
            // 处理序号文本框
            var tb = new TextBox3();
            tb.textvalue = group.SnoTextBox.Text;
            tb.HeightValue = group.SnoTextBox.Height;
            tb.WidthValue = group.SnoTextBox.Width;
            tb.LeftValue = group.SnoTextBox.Left;
            tb.TopValue = group.SnoTextBox.Top;
            tb.name = group.SnoTextBox.Name;
            dc.TextBox3s.InsertOnSubmit(tb);

            // 处理ID文本框
            var dtb4 = new TextBox4();
            dtb4.textvalue = group.IdTextBox.Text;
            dtb4.HeightValue = group.IdTextBox.Height;
            dtb4.WidthValue = group.IdTextBox.Width;
            dtb4.LeftValue = group.IdTextBox.Left;
            dtb4.TopValue = group.IdTextBox.Top;
            dtb4.name = group.IdTextBox.Name;
            dc.TextBox4s.InsertOnSubmit(dtb4);

            // 处理姓名文本框
            var dtb5 = new TextBox5();
            dtb5.textvalue = group.NameTextBox.Text;
            dtb5.HeightValue = group.NameTextBox.Height;
            dtb5.WidthValue = group.NameTextBox.Width;
            dtb5.LeftValue = group.NameTextBox.Left;
            dtb5.TopValue = group.NameTextBox.Top;
            dtb5.name = group.NameTextBox.Name;
            dc.TextBox5s.InsertOnSubmit(dtb5);

            // 处理职位文本框
            var dtb6 = new TextBox6();
            dtb6.textvalue = group.DesignationTextBox.Text;
            dtb6.HeightValue = group.DesignationTextBox.Height;
            dtb6.WidthValue = group.DesignationTextBox.Width;
            dtb6.LeftValue = group.DesignationTextBox.Left;
            dtb6.TopValue = group.DesignationTextBox.Top;
            dtb6.name = group.DesignationTextBox.Name;
            dc.TextBox6s.InsertOnSubmit(dtb6);

            // 处理考勤下拉框
            var dcm = new ComboBox2();
            dcm.LeftValue = group.AttendanceComboBox.Left;
            dcm.HeightValue = group.AttendanceComboBox.Height;
            dcm.TopValue = group.AttendanceComboBox.Top;
            dcm.WidthValue = group.AttendanceComboBox.Width;
            dcm.textvalue = group.AttendanceComboBox.Text;
            dcm.name = group.AttendanceComboBox.Name;
            dc.ComboBox2s.InsertOnSubmit(dcm);
        }

        // 一次性提交所有更改,提升效率
        dc.SubmitChanges();
        MessageBox.Show("所有记录插入成功");
    }
    catch (Exception ex)
    {
        MessageBox.Show("插入失败:" + ex.Message);
    }
}

额外优化点

原来的Button1_Click方法里,A +=1的位置有逻辑漏洞,会导致控件位置计算错误,修改如下:

internal void Button1_Click(object sender, EventArgs e)
{
    if (A >= 12) {
        MessageBox.Show("Cannot insert More than 12 records in a page");
        return; // 超过数量就不执行后续逻辑
    }
    A += 1;
    lbltext += 1;
    Show(); // 把Show()放在这里,逻辑更清晰
}

这样修改后,点击保存按钮就会把所有动态生成的行数据批量插入到数据库中了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:04:41