【问题标题】:Get values from dynamic controls with c#?使用 c# 从动态控件中获取值?
【发布时间】:2012-01-12 09:16:07
【问题描述】:

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

我在 page_load 事件上创建了一系列 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,那么我将一个名为“r”的项目添加到 radiobuttlist 我也尝试为此创建一个事件处理程序,但由于我从未与他们合作过,我真的不知道该怎么做。 :( 如果我看起来太可怜了,我很抱歉。

【问题讨论】:

  • 你能发布一些示例代码吗?另请注意,如果您想查看当前拥有的内容,当表单提交到服务器时,您应该能够看到 Request.Form 集合中的值。

标签: c# asp.net dynamic controls


【解决方案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】:

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

    【讨论】:

    • 不是答案,等你得到足够的代表。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-01
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        • 2012-05-31
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        相关资源
        最近更新 更多