无法从动态生成的单选按钮列表中读取值

时间:2016-08-17 01:26:09

标签: c# winforms

我正在尝试这样做:

  1. 从Windows注册表中读取多个值(有效)。这看起来像

    \HKLM\...\Server1
    int serverid 1
    string serverName "SRVSQL01"
    int serverport 1433
    string database "MyDatabase1"
    
    \HKLM\...\Server2
    dword/int serverid 2
    regsz/string serverName "SRVSQL02"
    dword/int serverport 1433
    regsz/string database "MyDatabase2"
    

    服务器数量可能会有所不同。

  2. 列出项目。我可以从注册表中读取值,这很好用

  3. 将值添加到C#类的多个实例(有效)

    我创建了一个包含4个变量/值的类“SQLServer”,如上所示。 然后我创建了一个这个类的多个实例的数组,例如,如果注册表中列出了4个服务器,我生成一个长度为4的数组,并将每个服务器的值添加到它自己的类的实体中。

    public class RegSQLListItem
    {
        public int MSSSQLID;
        public string MSSQLServer;
        public int MSSQLPort;
        public string MSSQLDatabase;
    }
    
  4. 根据数组中“项目”的数量生成单选按钮,在新表单中显示列表。

    我在这里找到了一些代码来动态生成带标签的单选按钮列表:https://msdn.microsoft.com/en-us/library/dwafxk44(v=vs.90).aspx

    // Generate form
    int ProjectCounter = (RegProjectRoot.GetSubKeyNames()).Count();
    // other code
    RadioButton[] radioButtons = new RadioButton[ProjectCounter];
    for (int i = 0; i < ProjectCounter; ++i)
    {
        radioButtons[i] = new RadioButton();
        radioButtons[i].TabIndex = i + 1;
        radioButtons[i].Name = ProjectListItem[i].MSSQLDatabase;
        radioButtons[i].Text = ProjectListItem[i].MSSQLDatabase;
        radioButtons[i].Location = new System.Drawing.Point(10, 10 + i * 20);
        this.Controls.Add(radioButtons[i]);
    }
    
  5. 如何捕获选中的单选按钮以及如何将相应的值传输到程序中的另一个例程?

    我特别感兴趣的是点击“确定”按钮捕获当前活动的单选按钮的值,然后选择我要连接的数据库。

    这是一种正确的方法吗?还是有一种更简单的方法? 我是C#的新手,所以我对这些可能性并不熟悉。

1 个答案:

答案 0 :(得分:0)

你可以用两种方式做到这一点。

1。添加如下所示的事件处理程序:

for (int i = 0; i < ProjectCounter; ++i)
{
    radioButtons[i] = new RadioButton();
    radioButtons[i].TabIndex = i + 1;
    radioButtons[i].Name = "ProjectListItem[i].MSSQLDatabase";
    radioButtons[i].Text = "ProjectListItem[i].MSSQLDatabase";
    radioButtons[i].Location = new System.Drawing.Point(10, 10 + i * 20);
    radioButtons[i].CheckedChanged += new EventHandler(rdo_CheckedChanged);
    this.Controls.Add(radioButtons[i]);
}

处理程序rdo_CheckedChanged将定义如下:

private static void rdo_CheckedChanged(object sender, EventArgs e)
{
    RadioButton rdoButton = sender as RadioButton;
    if (rdoButton.Checked)
    { 
       // procced the button is checked
    }
}

2. :遍历RadioButton

类型的控件

您可以使用以下代码遍历控件并识别所选的单选按钮:

foreach (RadioButton rdo in this.Controls.OfType<RadioButton>())
{
    if (rdo.Checked)
    {
        // this is checked radio button
        // Proceed with your code
    }
}