0

我正在尝试创建从数据库生成的问题的动态列表。

我用文本框和复选框列出了我的问题,我希望在选中复选框时将文本框中的文本写入单独的表中的数据库。

我可以将问题写入数据库,但文本框中没有答案。

下面的代码生成我的列表。

                    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 输入与另一个相同,但这是我让它运行的唯一方法。

任何想法如何将相关文本框链接到复选框。

4

3 回答 3

0

将 a 添加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用于数据库存储

于 2013-05-31T08:29:22.350 回答
0

你可以试试这个:

var textBoxValue = ((TextBox)checkBox.Parent
    .Controls[checkBox.Parent.Controls.IndexOf(checkBox) - 2]).Text;

基本上,您将使用复选框来获取父控件容器,然后通过使用它与复选框的相对位置来引用集合中的文本框。

请注意,只要您拥有简单且一致的页面设计,这是一种简单的方法。如果每个问题都有动态结构或相对路径过于复杂,我也建议使用 Nikola 的方法。

于 2013-05-31T08:29:33.437 回答
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 和长度与数据库中的内容对齐即可。我希望这行得通。;)

于 2013-05-31T08:30:34.873 回答