如何用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
相关产品推荐
相关产品推荐

