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

时间:2011-12-03 22:41:41

标签: c# asp.net dynamic controls

我在项目中创建了一些radiobuttonlist控件,每次加载页面时都会创建它们,我想获取用户选择的单选按钮的值,但由于我的单选按钮是动态创建的,所以我不知道知道如何访问他们的值以及如何创建他们的事件处理程序。有没有办法在创建控件时为控件指定名称或ID? 我希望你能帮助我。

我在page_load事件中创建了一个radiobuttlist的seires,文本及其值已从数据库中拉出。现在,用户必须从该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);
            }
        }

所以基本上我使用我的datareader来遍历数据库中的数据,如果字段中的值不为空或null,那么我将一个项添加到名为“r”的radiobuttlist中 我试图为它创建一个事件处理程序,但由于我从未使用过它们,我真的不知道该怎么做。 :( 如果我看起来太可悲,我很抱歉。

4 个答案:

答案 0 :(得分:1)

您可以在创建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
    }
}

答案 1 :(得分:1)

快速查看代码:

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

}

回发后有几种方法可以找到你的控件;您可以在Request.Forms集合中查找与您提交的控件名称匹配的控件,或者更恰当地说,您可以将FindControl方法与您为控件提供的ID一起使用。请参阅C#, FindControl以获取带有方法的帖子(作者Jeff Atwood!),该帖子将搜索控件的整个控件层次结构。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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