使用c#从动态控件获取值

本文关键字:获取 动态控件 使用 | 更新日期: 2023-09-27 18:16:54

我在我的项目上创建了一些单选按钮控件,它们是每次加载页面时创建的,我想获得用户选择的单选按钮的值,但是由于我的单选按钮是动态创建的,我不知道如何访问它们的值也不知道如何创建它们的事件处理程序。是否有一种方法来分配一个名称或id的控件,当我创建它?我希望你能帮助我。

我在page_load事件上创建了一系列radiobuttlist,其中的文本及其值是从数据库中提取出来的。现在,用户必须从那个radiobuttlist中选择一个选项我想要获取用户选中的那个单选按钮的值。如果我不知道radiobuttlist的名称和id,我该怎么做呢,因为它们是动态创建的。这是我得到的:

for (int i = 3; i < numfields; i++) {
            if (dr[i].ToString() != "" && dr[i] != null){
                r.Items.Add(new ListItem(dr[i].ToString(), dr[i].ToString()));
                //r.SelectedIndexChanged += new EventHandler(rowSelectedIndex);
            }
        }

所以基本上我使用我的数据阅读器来遍历数据库中的数据,如果来自字段的值不是空或null,那么我添加一个项目到radiobuttlist名为"r"我也试着为此创建一个eventandler,但是因为我从来没有使用过它们,所以我真的不知道该怎么做。:(如果我看起来太可悲了,我很抱歉。

使用c#从动态控件获取值

快速查看您的代码:

for (int i = 3; i < numfields; i++) { 
            if (dr[i].ToString() != "" && dr[i] != null){ 
                r.Items.Add(new ListItem(dr[i].ToString(), dr[i].ToString())); 
                //r.SelectedIndexChanged += new EventHandler(rowSelectedIndex); 
            } 
        } 

跳出来的最明显的东西是if语句。您应该首先检查null:

if (dr[i] != null && dr[i].ToString() != ""){

如果dr[i]为null,您将得到一个异常(因为您将尝试在null对象上调用ToString()方法)。

如果dr的内容总是字符串,你可以考虑这样写:

if(!String.IsNullOrEmpty(dr[i]){

我还注意到你从3开始索引——这是因为你想跳过前3个字段吗?

无论在哪里创建变量'r',都可以设置名称和ID属性。可以使用ID属性查找PostBack上的控件。如果你像这样创建放射科医生:

RadioButtonList r = new RadioButtonList();
r.Id = "MyRadioButtonList";
r.SelectedIndexChanged += MyRadioButton_SelectedIndexChanged;

指向以下事件处理程序:

private void MyRadioButton_SelectedIndexChanged(Object sender, EventArgs e) {
    ... Do Stuff ...    
}

当你返回时,有几种方法可以找到你的控制;您可以在请求中查看。与您提交的控件的名称相匹配的控件的表单集合,或者更恰当地说,您可以使用FindControl方法和您为该控件提供的ID。请参阅c#, FindControl,其中有一个方法(由Jeff Atwood编写!),该方法将在整个控件层次中搜索您的控件。

添加动态控件时也很重要。如果您在页面生命周期中太晚添加它,那么它将无法在PostBack中使用。当添加控件时,请参阅http://support.microsoft.com/kb/317515了解更多关于的详细信息。有很多关于动态ASP的资源。

您可以在创建RadioButton时将其放入列表中。这也是您想要添加处理程序的时候。

RadioButton rb;
for (int i = 1; i < 5; i++)
{
    rb = new RadioButton();
    rb.AutoSize = true;
    rb.Location = new System.Drawing.Point(25, (i*25) + 25);
    rb.Name = "radioButton" + i.ToString();
    rb.Text = "radioButton" + i.ToString();
    //Add some event handler?
    this.Controls.Add(rb);
    lstRadioButton.Add(rb);
}

当你想知道哪一个被选中时,你可以对你的列表执行foreach循环,看看你的RadioButton是否被选中。

foreach (RadioButton rButton in lstRadioButton)
{
    if (rButton.Checked == true)
    {
        //Do something
    }
}

如果程序名称不适合您,您可能正在搜索TagName属性。

问题是您正在page_load中创建控件。为了将它们的值正确地发送回控件,必须将此创建移动到page_init方法中,并每次重新创建它们。

然后,在page_load中,您可以正确访问控件中的值。如果您使用一致的命名约定为它们提供id,您将能够使用FindControl方法找到它们,或者在page_init中,您可以将它们存储在页面或用户控制级别的集合中。