динамическое создание формы окна в соответствии с данными, возвращаемыми из набора данных (C #) - PullRequest
0 голосов
/ 22 марта 2012

У меня есть набор данных, который возвращает вопросы и ответы из базы данных, каждый ответ в таблице ответов связан через поддельный ключ с таблицей вопросов.

Я хотел бы добиться следующего:

То, что по первому вопросу создается единая динамическая форма со всеми перечисленными ниже вопросами, то есть FK_table_Answers = PK_table_Questions для table_Answers:

(например) Это форма для первого вопроса:

    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 раза, потому что есть три ответа, поэтому любой может указать мне правильное направление, как генерироватьформируется динамически, но только ОДИН РАЗ - это означает, что каждая последующая форма создается только один раз в соответствии с вопросом, и что конкретные вопросы отвечают на него.

С уважением

ОБНОВЛЕННЫЙ код:

    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 Ответ

2 голосов
/ 22 марта 2012

Если я правильно понимаю, вы вызываете 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 вызов

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....
}

Теперь при вводе метода очистите все элементы управления RadioButton на панели. Коллекция элементов управления

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

остальная часть кода должна изменяться только для отражения нового текста, назначенного метке и элементам управления, и повторного добавления кнопок RadioButtons на панель. Больше не нужно создавать и повторно инициализировать метку формы, кнопку.

label.Text = _label;

Не забудьте уничтожить _form в конце вашей программы с помощью _form.Dispose ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...