3

私はC#を初めて使用し、5つのラジオボタン(強く同意しない、同意しない...非常に同意するなど)のいずれかを選択することで回答される30の質問を含む調査であるプログラムを作成しようとしています。

質問に対してどのラジオボタンがチェックされているかをチェックし、配列に値を割り当てるコードの小さな「ブロック」を設定しました (以下を参照)。

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    }

    private void buttonScore_Click(object sender, EventArgs e)
    {
        this.textBoxScoreOutput.Text = " ";

        int[] score = new int[2]; // Declares the integer of score and sets it to a value of zero

        // Question 1

        if (radioButtonSD1.Checked == true) // If Strongly Disagree checked give score a value of 1
            score[0] = 1;
        else if (radioButtonD1.Checked == true) // If Disagree checked give score a value of 2
            score[0] = 2;
        else if (radioButtonNS1.Checked == true) // If Not Sure checked give score a value of 3
            score[0] = 3;
        else if (radioButtonA1.Checked == true) // If Agree checked give score a value of 4
            score[0] = 4;
        else if (radioButtonSA1.Checked == true) // If Strongly Agree is checked give score a value of 5
            score[0] = 5;

        // Question 2

        if (radioButtonSD2.Checked == true) // If Strongly Disagree checked give score a value of 1
            score[1] = 1;
        else if (radioButtonD2.Checked == true) // If Disagree checked give score a value of 2
            score[1] = 2;
        else if (radioButtonNS2.Checked == true) // If Not Sure checked give score a value of 3
            score[1] = 3;
        else if (radioButtonA2.Checked == true) // If Agree checked give score a value of 4
            score[1] = 4;
        else if (radioButtonSA2.Checked == true) // If Strongly Agree is checked give score a value of 5
            score[1] = 5;

        // Output values in array to text box

        this.textBoxScoreOutput.Text = "Array: ";

        foreach (int i in score)
        {
            this.textBoxScoreOutput.Text += "[" + i.ToString() + "] ";
        }

        int sum = score.Sum();
        this.textBoxScoreOutput.Text += "The Sum of the array is: " + sum.ToString();
    }


}
}

つまり、これは 30 の質問のうち最初の 2 つをチェックしており、まさに私が必要としており、そうなると思っていたとおりに機能しています。

これらの「ブロック」の 1 つだけをループして、30 の質問すべてをチェックできるかどうか疑問に思っていました。検索しても検索しても、探しているものを正確に見つけることができません (正しいものを検索していない可能性があることも理解しています)。

プログラムにこれらの「ブロック」が 30 個含まれないようにしています。これが30個あるとめちゃくちゃになる気がする。これは可能ですか?

4

2 に答える 2

2

1 つの質問のロジックをカプセル化する UserControl の作成から始めます。

  • 質問文
  • 選択したオプション

1 つの質問が機能したら、任意の数のユーザー コントロールをフォームにドロップし、質問テキストを構成してから、一連のユーザー コントロールをループするだけで回答を得ることができます。答えは、列挙型として返されるのが最適です。

コントロールを生成するコードや、選択範囲を ViewModel クラスにバインドするなど、これを実現する方法はいくつかありますが、ユーザー コントロールは最初の一歩として最適です。

于 2012-11-27T03:10:38.580 に答える
1

これが私が大まかに行う方法です:

var resultList = new List<KeyValuePair<string, int>>();


foreach (var control in this.Controls)
{
    if (control is GroupBox)
    {
         GroupBox gb = (GroupBox)control;
         foreach (Control controll in gb.Controls)
         {
             if (controll is RadioButton)
             {
                RadioButton rb = new RadioButton();
                rb = (RadioButton)controll;
                //rb will allow you to access all of the RadioButton's properties and act accordingly.    
                if (rb.Checked)
                {
                    int score;
                    if (rb.Name.Contains("ButtonSD"))
                        score = 1;
                    if (rb.Name.Contains("ButtonD"))
                        score = 2;
                    //So on...
                    resultList.Add(new KeyValuePair<string, int>(gb.Name, score));

                }
             }
         }
    }
}

大変な一日だったので、誰かがもっと良いものを思いつくかもしれませんが、全体を再編成したくない場合は、これでうまくいくかもしれません.

于 2012-11-26T22:17:30.560 に答える