none
有關傳回一組RadioButton的值的問題 RRS feed

  • 問題

  • 開發工具:Visual Basic 2005 (WinForm)

    假如現在有三個RadioButton : rdo1,rdo2,rdo3

    如果我希望能夠取的這組RadioButton選中的值,比如說選rdo1就是1,選rdo2就是2,選rdo3就是三

    有沒有比較好的寫法?

    我現在寫法有兩種,一種是直接在要用的地方做 If 判斷,比如說:

    If rdo1.Checked then
          msgbox "1"
    elseif .........

    然後第二種是在Form的Class中寫一個Property,比如說:

    Private ReadOnly Property GetRdoValue() As Integer
            Get
                If rdo1.Checked Then
                    Return 1
                ElseIf rdo2.Checked Then
                    Return 2
                ElseIf rdo3.Checked Then
                    Return 3
                Else
                    Return 0
                End If
            End Get
    End Property

    然後再要用的地方寫:

    Msgbox GetRdoValue.toString

    有沒有比這種寫法還要優化的?有什麼地方需要改進還有注意嗎?

    謝謝!

     

    2007年1月4日 上午 11:42

解答

  • 最簡單的方法,就是使用 Dictionary<string, string> 泛型類別,先把對應表做好,然後再於那個事件常式,使用 Dictionary.ContainKey() 判斷對應表中有沒有那個 ID,有的話就用 Dictionary.Items(ID) 去取得裡面的值。

    不過你要查一下 Visual Basic 的泛型用法,我只寫過 C# 的泛型用法,以你的程式,大概會是長這樣:

    // build map table.
    Dictionary<string, string> MapTable = new Dictionary<string, string>();

    MapTable.Add("rdo1", "XXX1");
    MapTable.Add("rdo2", "XXX2");
    MapTable.Add("rdo3", "XXX3");
    ...

    // event handler.
    public void RadioButton_Click(object sender, EventArgs e)
    {
         if (MapTable.ContainsKey(((RadioButton)sender).ID))
             MessageBox.Shop(MapTable[((RadioButton)sender).ID]);
    }

    2007年1月5日 上午 07:14
    版主

所有回覆

  • 我提供一下不同的作法,供您參考。

     Private Sub Check(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, RadioButton3.CheckedChanged

            If CType(sender, RadioButton).Checked = True Then

                MessageBox.Show(CType(sender, RadioButton).Name)

            End If

        End Sub

    2007年1月4日 下午 11:08
    版主
  • 嗯!謝謝你!

    如果我想達到下列目的:

    比如說我有一個Array裡面:a(2)

    a(0)="XXX1"
    a(1)="YYY2"
    a(2)="BBB3"

    如果選 rdo1時要抓a(0),rdo2要抓a(1),rdo3抓a(2)

    這樣的話如果是想要按下一個另外的button的時候抓出現在選的rdo所代表的字串

    如果用您的方法,好像就不知道該怎麼寫 

    好像是要變成要定義一個全域變數SelectValue as integer

    然後在

    Private Sub Check(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, RadioButton3.CheckedChanged

            If CType(sender, RadioButton).Name = "rdo1" Then

                SelectValue=0

            '......其他的rdo

            End If

     End Sub

    然後在Button的Click中,寫:

    Msgbox(a(SelectValue))

    這樣嗎?

    只是如果想要評估這種方式和我第二種方式(寫Property的方式)的執行效能,還有記憶體的用量

    要怎麼評估才好?

    因為我不知道用Property對記憶體的用量還有他在ButtonClick的時候使用a(SelectValue)的時候花費的時間

    和如果現在這種方法(多加一個變數)花的時間,與記憶體的用量,那個比較大(還有要考慮如果使用者Change RadioButton的Checked了N次,整體花費的時間那個會比較大,因為有些使用者會猶豫不決,在兩個RadioButton上選來選去,現在是因為執行的內容不多,如果要執行的東西很多的話兩種方法應該會有些差別吧?)

    我希望能夠找出一個方法是最精簡的,有這種方法可以找嗎?(有沒有相關的方法是找執行一段程式他所耗費的系統資源的?)

    謝謝!

    2007年1月5日 上午 05:54
  • 最簡單的方法,就是使用 Dictionary<string, string> 泛型類別,先把對應表做好,然後再於那個事件常式,使用 Dictionary.ContainKey() 判斷對應表中有沒有那個 ID,有的話就用 Dictionary.Items(ID) 去取得裡面的值。

    不過你要查一下 Visual Basic 的泛型用法,我只寫過 C# 的泛型用法,以你的程式,大概會是長這樣:

    // build map table.
    Dictionary<string, string> MapTable = new Dictionary<string, string>();

    MapTable.Add("rdo1", "XXX1");
    MapTable.Add("rdo2", "XXX2");
    MapTable.Add("rdo3", "XXX3");
    ...

    // event handler.
    public void RadioButton_Click(object sender, EventArgs e)
    {
         if (MapTable.ContainsKey(((RadioButton)sender).ID))
             MessageBox.Shop(MapTable[((RadioButton)sender).ID]);
    }

    2007年1月5日 上午 07:14
    版主