C#如何在2个创建的具有不同列名值的动态文本框中插入数据

  • 本文关键字:动态 文本 数据 插入 2个 创建 c#
  • 更新时间 :
  • 英文 :


如果我创建两个动态文本框并将每个值存储在一行中,如何插入数据我的数据库表名是dbo.test,里面是test-varchar(50(和test1-varchar(50

Stack<TextBox> textboxes = new Stack<TextBox>();
List<String> controlNames = new List<String>();

private void butSave_Click(object sender, EventArgs e)
{
TextBox textBox = (TextBox)this.Controls.Find(controlNames[0], true)[0];
TextBox textBox1 = (TextBox)this.Controls.Find(controlNames[1], true)[0];
foreach (TextBox controlNames in textboxes.OfType<TextBox>()) ;
{ 
conn.Open();
SqlCommand cmd = new SqlCommand("test_info", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@test", textBox.Text);
cmd.Parameters.AddWithValue("@test1", textBox1.Text);
cmd.ExecuteNonQuery();
conn.Close();

}
MessageBox.Show("Data Save");
textboxes.Clear();
refresh();
}

如果我把数据放在2个文本框中,文本框1是John,文本框2是James,那么它只会在两列中存储John。我需要将它们存储在每个文本框中输入的值上。

这是生成动态文本框的代码。我使用for循环,这样,如果用户想在数据库中添加另一个数据,比如他想在第一行添加James和John,并想添加另一行,名称是Todd和Tedd,每次点击都会添加另外两个动态文本框。

count++;
for (int i = 0; i < count; i++)
{

TextBox textadd1 = new TextBox();
this.Controls.Add(textadd1);
textadd1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
textadd1.ForeColor = System.Drawing.Color.Black;
textadd1.Location = new System.Drawing.Point(Left, Top);
textadd1.Name = "textBox1";
textadd1.BringToFront();
textadd1.Size = new Size(36, 24);
textadd1.TextAlign = HorizontalAlignment.Center;
textadd1.Text = "";
textboxes.Push(textadd1);
controlNames.Add(textadd1.Name);

TextBox textadd2 = new TextBox();
this.Controls.Add(textadd2);
textadd2.BackColor = System.Drawing.Color.White;
textadd2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
textadd2.ForeColor = System.Drawing.Color.Black;
textadd2.Location = new System.Drawing.Point(250, Top);
textadd2.Name = "textBox";
textadd2.BringToFront();
textadd2.Size = new System.Drawing.Size(56, 12);
textadd2.TextAlign = HorizontalAlignment.Center;
textboxes.Push(textadd2);
controlNames.Add(textadd2.Name);
Top += 22;
count--;
}

}

ALTER PROCEDURE[dbo]。[测试信息]--在此处添加存储过程的参数

@test varchar(50),
@test1 varchar(50)

作为开始

insert into [dbo].[test](test,test1)values(@test,@test1)

结束//SQL

问题是您为文本框设置了固定名称。我不知道C#是如何管理的,因为在同一个容器表单中不能有两个同名的控件,无论如何,你的问题就在添加新文本框的代码中:

textadd1.Name = "textBox1";
--
textadd2.Name = "textBox";

这意味着您的变量controlNames将存储如下内容"textBox1";"text框";"textBox1";"text框";…等等

您可以通过为名称提供非传统信息来解决此问题,使其具有唯一性,例如:

textadd1.Name = "textBox" + controlNames.Count

除此之外,我不明白你为什么要用count++,count--。但以上至少是代码的一个问题。

编辑:对于在数据库中插入名称的循环,可以在controlNames变量上使用循环。由于你需要2乘2获得它们,一种可能的方法是

int n = 1;
while (n < controlNames.Count) {
// First we get the textboxes
TextBox textBox = (TextBox)this.Controls.Find(controlNames[n-1], true)[0];
TextBox textBox1 = (TextBox)this.Controls.Find(controlNames[n], true)[0];

// Insert to db
conn.Open();
SqlCommand cmd = new SqlCommand("test_info", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@test", textBox.Text);
cmd.Parameters.AddWithValue("@test1", textBox1.Text);
cmd.ExecuteNonQuery();
conn.Close();  
// We increment the iterator variable by 2
n = n + 2;
}

请注意,在您的代码片段中,您总是使用textBox1(来自controlNames[0](和textBox(来自controlNames[1](,然后将它们插入数据库中的次数与您在controlNames中的项一样多。

编辑2:由于你似乎已经创建了5个文本框,这个循环看起来应该与你发布的答案有点不同:

int n = 0; 
while (n < controlNames.Count)
{
// First we get the textboxes
TextBox textBox1 = (TextBox)this.Controls.Find(controlNames[n], true)[0];
TextBox textBox2 = (TextBox)this.Controls.Find(controlNames[n + 1], true)[0];
TextBox textBox3 = (TextBox)this.Controls.Find(controlNames[n + 2], true)[0];
TextBox textBox4 = (TextBox)this.Controls.Find(controlNames[n + 3], true)[0];
TextBox textBox5 = (TextBox)this.Controls.Find(controlNames[n + 4], true)[0];
//...
n = n + 5;
}

请注意,你的controlNames数组的大小将是5,从0开始,这意味着如果你这样做

int n = 1;
...
controlNames[n-2] // would be controlNames[-1]

这就是提出";索引超出范围";错误位置-1、-2等等都不存在。

无论如何,这对我来说似乎没有意义。你是在创建5个文本框,然后再创建5个(总共10个(,以此类推吗?或者您的参数只需要5个文本框?在这种情况下,我们的想法是从0到4循环5个文本框,不包括while循环中的+1、+2或-1、-2。这看起来像:

for (int n = 0; n < controlNames.Count; n++)
{
// We get each texbox and fill the bd parameter
TextBox myTextBox = (TextBox)this.Controls.Find(controlNames[n], true)[0];
cm.Parameters.AddWithValue("@test" + n,  myTextBox.Text); // here you should perform some change to only add n to @test if its > 0
}
cm.Parameters.AddWithValue("@fname", label1.Text);
cm.ExecuteNonQuery();
...

尝试:

foreach (var controlNames in textboxes.OfType<TextBox>()) ;
{ 
conn.Open();
SqlCommand cmd = new SqlCommand("test_info", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@test", controlNames.Text);
cmd.ExecuteNonQuery();
conn.Close();

}

我尝试这些代码,它会给我错误。/'索引超出范围。必须是非负数并且小于集合的大小。参数名称:index‘

if (t1.Text == "")
{
MessageBox.Show("Invalid");
}
else
{   
conn.Open();
SqlCommand cm = new SqlCommand("test_info", conn);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.AddWithValue("@test",  t1.Text);
cm.Parameters.AddWithValue("@test1", t2.Text);
cm.Parameters.AddWithValue("@test2", t3.Text);
cm.Parameters.AddWithValue("@test3", t4.Text);
cm.Parameters.AddWithValue("@test4", t5.Text);
cm.Parameters.AddWithValue("@fname", label1.Text);
cm.ExecuteNonQuery();
conn.Close();
int n = 1;
while (n < controlNames.Count)
{
// First we get the textboxes
TextBox textBox1 = (TextBox)this.Controls.Find(controlNames[n - 1], true)[0];
TextBox textBox2 = (TextBox)this.Controls.Find(controlNames[n], true)[0];
TextBox textBox3 = (TextBox)this.Controls.Find(controlNames[n - 2], true)[0];
TextBox textBox4 = (TextBox)this.Controls.Find(controlNames[n - 3], true)[0];
TextBox textBox5 = (TextBox)this.Controls.Find(controlNames[n - 4], true)[0];
// Insert to db
conn.Open();
SqlCommand cmd = new SqlCommand("test_info", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@test", textBox1.Text);
cmd.Parameters.AddWithValue("@test1", textBox2.Text);
cmd.Parameters.AddWithValue("@test2", textBox3.Text);
cmd.Parameters.AddWithValue("@test3", textBox4.Text);
cmd.Parameters.AddWithValue("@test4", textBox5.Text);
cmd.Parameters.AddWithValue("@fname", label1.Text);
cmd.ExecuteNonQuery();
conn.Close();
// We increment the iterator variable by 2
n = n + 5;
}

MessageBox.Show("Data Save");
textboxes.Clear();
refresh();

最新更新