根据数据集(C#)返回的数据动态创建窗体

时间:2012-03-22 09:11:35

标签: c# winforms

我有一个数据集,可以从数据库中返回问题和答案,答案表中的每个答案都通过forgein键链接到问题表。

我想要达成的目标如下:

在第一个问题上创建了一个动态表单,其中列出了所有问题,这意味着table_Answers上的FK_table_Answers = PK_table_Questions:

(例如)这是问题一的表格:

    Question One: How old are you?

   Answer One (this is a radio button)

   Answer Two (this is a radio button)

  Answer Three (this is a radio button)

我已经设法得到上述类型的工作,但问题是我的代码不断生成表单(例如)3次,因为有三个答案,所以任何人都可以指出我正确的方向如何动态生成表单但只ONCE - 意味着每个连续的表单只根据问题创建一次,并且特定的问题在其下面回答。

亲切的问候

更新的代码:

    private void LoadDataSets()
    {
        if (_dataSetQuestionnaire.tbl_QuestionnaireQuestion.Rows.Count == 0)
        {
            try
            {
                //Questionnaire:
                DataSet1TableAdapters.tbl_QuestionnaireTableAdapter questionnaireAdapter =
                                 new DataSet1TableAdapters.tbl_QuestionnaireTableAdapter();
                questionnaireAdapter.Fill(_dataSetQuestionnaire.tbl_Questionnaire);

                //Category:
                DataSet1TableAdapters.tbl_QuestionnaireCategoryTableAdapter categoryAdapter =
                               new DataSet1TableAdapters.tbl_QuestionnaireCategoryTableAdapter();
                categoryAdapter.Fill(_dataSetQuestionnaire.tbl_QuestionnaireCategory);

                //QuestionnaireQuestion:
                DataSet1TableAdapters.tbl_QuestionnaireQuestionTableAdapter questionnaireQuestionAdapter =
                                  new DataSet1TableAdapters.tbl_QuestionnaireQuestionTableAdapter();
                questionnaireQuestionAdapter.Fill(_dataSetQuestionnaire.tbl_QuestionnaireQuestion);

                //QuestionnaieAnswer:
                DataSet1TableAdapters.tbl_QuestionnaireAnswerTableAdapter questionnaireAnswerAdapter =
                                 new DataSet1TableAdapters.tbl_QuestionnaireAnswerTableAdapter();
                questionnaireAnswerAdapter.Fill(_dataSetQuestionnaire.tbl_QuestionnaireAnswer);

                using (DataSet1 dSet = new DataSet1())
                {
                    //Questionnaire:
                    dSet.Merge(_dataSetQuestionnaire.tbl_Questionnaire);
                    //Category:
                    dSet.Merge(_dataSetQuestionnaire.tbl_QuestionnaireCategory);
                    //QuestionnaireQuestion:
                    dSet.Merge(_dataSetQuestionnaire.tbl_QuestionnaireQuestion);
                    //QuestionnaieAnswer:
                    dSet.Merge(_dataSetQuestionnaire.tbl_QuestionnaireAnswer);

                    int primaryKeyQuestionnaire = Convert.ToInt32(_dataSetQuestionnaire.tbl_Questionnaire.Rows[0][0]);

                    foreach (DataSet1.tbl_QuestionnaireRow questionnaire
                                        in _dataSetQuestionnaire.Tables["tbl_Questionnaire"].Select(String.Format("pk_tbl_Questionnaire = {0}", primaryKeyQuestionnaire)))
                    {
                        foreach (DataSet1.tbl_QuestionnaireCategoryRow category
                                       in _dataSetQuestionnaire.Tables["tbl_QuestionnaireCategory"].Select(String.Format("fk_tbl_Questionnaire = {0}", questionnaire.pk_tbl_Questionnaire)))

                                       {
                            foreach (DataSet1.tbl_QuestionnaireQuestionRow question
                                           in _dataSetQuestionnaire.Tables["tbl_QuestionnaireQuestion"].Select(String.Format("fk_tbl_QuestionnaireCategory = {0}", category.pk_tbl_QuestionnaireCategory)))
                            {
                                int radiobuttonPosition = 0;
                                foreach (DataSet1.tbl_QuestionnaireAnswerRow answer
                                                   in _dataSetQuestionnaire.Tables["tbl_QuestionnaireAnswer"].Select(String.Format("fk_tbl_QuestionnaireQuestion = {0}", question.pk_tbl_QuestionnaireQuestion)))
                                {


                                    //Gets the questins via the FK_questionnaireQuestion and fill the _dataSetRadioButtons to generate on dynamic form.
                                    DataSet1TableAdapters.tbl_QuestionnaireAnswerTableAdapter a =
                                                     new DataSet1TableAdapters.tbl_QuestionnaireAnswerTableAdapter();

                                    DataSet dSetRadioButtons = new DataSet();
                                    dSetRadioButtons.Merge(a.GetDataByQuestionnaireQuestion(answer.fk_tbl_QuestionnaireQuestion));
                                    _dataSetRadioButtons = dSetRadioButtons;

                                    string theQuestion = question.tbl_QuestionnaireQuestion_Description.ToString();

                                    Form form = new Form();
                                    _form = form;

                                    if(_form == null)
                                    {
                                        _form = new Form();
                                    }
                                    else
                                    {
                                        form.Height = 400;
                                        form.Width = 550;
                                        form.StartPosition = FormStartPosition.CenterScreen;

                                        Label label = new Label();
                                        label.Location = new System.Drawing.Point(5, 10);
                                        label.Size = new System.Drawing.Size(450, 25);
                                        label.Text = theQuestion;

                                        Panel panel = new Panel();
                                        panel.Size = new System.Drawing.Size(300, 200);
                                        panel.Location = new System.Drawing.Point(15, 50);
                                        panel.BackColor = Color.Yellow;

                                        System.Windows.Forms.RadioButton[] radioButtons = new System.Windows.Forms.RadioButton[_dataSetRadioButtons.Tables["tbl_QuestionnaireAnswer"].Rows.Count];

                                        for (int i = 0; i < _dataSetRadioButtons.Tables["tbl_QuestionnaireAnswer"].Rows.Count; i++)
                                        {
                                            radioButtons[i] = new RadioButton();
                                            radioButtons[i].Text = _dataSetRadioButtons.Tables["tbl_QuestionnaireAnswer"].Rows[i]["tbl_QuestionnaireAnswer_Description"].ToString();
                                            radioButtons[i].Location = new System.Drawing.Point(60, 20 + i * 20);

                                            //panel.Controls.Add(radioButtons[i]);

                                            radioButtons[i].Click += new EventHandler(Form1_Click);

                                            Int64 item = Convert.ToInt64(_dataSetRadioButtons.Tables["tbl_QuestionnaireAnswer"].Rows[0].ItemArray[3].ToString());
                                            panel.Controls.Add(radioButtons[i]);
                                        }

                                        Button nextButton = new Button();
                                        nextButton.Text = "Next";
                                        nextButton.Name = "button";
                                        nextButton.Location = new System.Drawing.Point(200, 300);
                                        nextButton.Size = new System.Drawing.Size(150, 25);
                                        nextButton.Click += new EventHandler(nextButton_Click);

                                        form.Controls.AddRange(new Control[] { panel, label, nextButton });

                                        form.ShowDialog();

                                        CreateBoxAndQuestion(form, panel, label);

                                        //form.Dispose();
                                    }

                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        else
        {
            MessageBox.Show("Error");
        }
    }

    private void CreateBoxAndQuestion(Form f, Panel p, Label l)  
    {
        for (int i = p.Controls.Count - 1; i >= 0; i--)
        {
            p.Controls.RemoveAt(i);
        }
    }

1 个答案:

答案 0 :(得分:2)

如果我理解正确,每次选择新问题时都会调用CreateBoxAndQuestion 但是每次代码进入此方法时,您都会创建(并销毁)表单 第一种方法是将表单,标签,按钮和面板创建保留在方法之外(可能在设计模式下),然后将这些控件传递给方法

编辑:在输入下一个问题的负载之前,代码中的某处:

frmQuestion _form = null; // Global

// Create a global instance and keep it without displaying
if(_form == null) _form = new frmQuestion(); // frmQuestion created with panel, label e button via FormDesigner

然后当你需要填充_form call

CreateBoxAndQuestion(_form, _form.Panel, _form.Label, questionText);

在这个例子中,我将_form传递给CreateBoxAndQuestion,但这不是必需的,因为它是全局的。您可以更改CreateBoxAndQuestion以直接使用全局实例。

private void CreateBoxAndQuestion(frmQuestion f, Panel p, Label l, string _label) 
{
    // Do not display your form here....
}

现在输入方法时,清除panel.Controls集合中的每个RadioButton控件

for (int i = p.Controls.Count - 1; i >= 0; i--) 
{ 
    p.Controls.RemoveAt(i); 
} 

其余代码应仅更改以反映分配给标签和控件的新文本以及将RadioButtons重新添加到面板。不再创建和重新初始化表单标签,按钮。

label.Text = _label;

不要忘记使用_form.Dispose();

在程序结束时销毁_form