我正在尝试创建一个从数据库生成的动态问题列表。
我通过文本框和复选框列出了我的问题,我希望在选中复选框时将文本框中的文本写入数据库的单独表格中。
我可以将问题写入数据库,但文本框中没有答案。
下面的代码会生成我的列表。
com = new OleDbCommand("SELECT [Task] FROM Debrief_Tasks WHERE [Current] = TRUE AND [Group] = 4", Program.DB_CONNECTION);
datareader = com.ExecuteReader();
int e = 1;
while (datareader.Read())
{
try
{
string Task = datareader.GetString(0);
Label taskLable = new Label();
taskLable.Text = Task;
taskLable.AutoSize = true;
taskLable.Anchor = AnchorStyles.Left;
TextBox nameTextBox = new TextBox();
nameTextBox.Name = ToString();
nameTextBox.AutoSize = true;
nameTextBox.Anchor = AnchorStyles.None;
nameTextBox.Padding = new Padding(1);
nameTextBoxes.Add(nameTextBox);
CheckBox completeCheckBox = new CheckBox();
completeCheckBox.Name = Task.ToString();
completeCheckBox.AutoSize = true;
completeCheckBox.Anchor = AnchorStyles.None;
completeCheckBox.CheckAlign = ContentAlignment.MiddleCenter;
completeCheckBox.Padding = new Padding(1);
completeCheckBox.CheckedChanged += new EventHandler(completeCheckBox_CheckedChanged);
completeCheckBoxes.Add(completeCheckBox);
tableLayoutPanel5.RowCount = e + 2;
tableLayoutPanel5.Controls.Add(taskLable, 0, e + 1);
tableLayoutPanel5.Controls.Add(nameTextBox, 1, e + 1);
tableLayoutPanel5.Controls.Add(completeCheckBox, 2, e + 1);
i++;
}
catch
{
}
}
}
}
}
}
void completeCheckBox_CheckedChanged(object sender, EventArgs e)
{
CheckBox checkBox = (CheckBox)sender;
if (checkBox.Checked)
{
OleDbCommand com = new OleDbCommand("INSERT INTO Debrief ([Debrief_Date], [Task], [DoneName]) VALUES (?, ?, ?)", Program.DB_CONNECTION);
com.Parameters.Add(new OleDbParameter("", DateTime.Today.Date));
com.Parameters.Add(new OleDbParameter("", Convert.ToString(checkBox.Name)));
com.Parameters.Add(new OleDbParameter("", ***Convert.ToString(checkBox.Name***)));
OleDbDataReader datareader = com.ExecuteReader();
}
else
{
}
}
我知道我的最后一个sql输入与另一个相同,但这是我可以让它运行的唯一方法。
如何将相关文本框链接到复选框。
答案 0 :(得分:0)
在您的代码中添加Dictionary<CheckBox, TextBox>
,其中包含对相关CheckBoxes
和TextBoxes
的引用,如下所示:
在类范围内创建字典:
Dictionary<CheckBox, TextBox> pairs = new Dictionary<CheckBox, TextBox>();
并在代码中添加代码,在创建它们之后将每个CheckBox-TextBox对插入Dictionary
:
pairs.Add(completeCheckBox,nameTextBox);
在completeCheckBox_CheckedChanged
中使用TextBox
引用检索CheckBox
TextBox associatedTextBox = null;
pairs.TryGetValue(checkBox, out associatedTextBox);
并使用associatedTextBox.Text
进行数据库存储
答案 1 :(得分:0)
你可以试试这个:
var textBoxValue = ((TextBox)checkBox.Parent
.Controls[checkBox.Parent.Controls.IndexOf(checkBox) - 2]).Text;
基本上,您可以使用复选框获取父控件容器,然后使用它与复选框的相对位置来引用集合中的文本框。
请注意,只要您拥有简单一致的页面设计,这就是一种简单的方法。如果每个问题都有动态结构或相对路径太复杂,我还建议使用Nikola的方法。
答案 2 :(得分:0)
你可以在if(checkbox.Checked)条件中尝试类似这样的代码...
OleDbCommand com = new OleDbCommand("INSERT INTO Debrief ([Debrief_Date], [Task], [DoneName]) VALUES (@Debrief_Date, @Task, @DoneName)", Program.DB_CONNECTION);
com.Parameters.Add(new OleDbParameter("@Debrief_Date", OledbType.DateTime)).Value = DateTime.Today.Date;
com.Parameters.Add(new OleDbParameter("@Task", OledbType.VarChar, 30)).Value = checkBox.Text;
com.Parameters.Add(new OleDbParameter("@DoneName", OledbType.VarChar, 30)).Value = checkBox.Text;
Program.DB_CONNECTION.Open();
com.ExecuteNonQuery();
那只是一个测试代码。只需将dbtypes和长度与数据库中的数据对齐即可。我希望有效。 ;)