1

我正在研究 C# 和 ASP.NET 4.0 中的解决方案我试图从我的页面中获取单选按钮的值,该页面是基于一些数据库信息动态创建的。

以下是在页面源中生成的内容:

<td>
  <input id="masterMain_3Answer_0" type="radio" name="ctl00$masterMain$3Answer"     
    value="Y" onclick="return answeredyes(3);" />
  <label for="masterMain_3Answer_0">Y</label>
</td>
<td>
  <input id="masterMain_3Answer_1" type="radio" name="ctl00$masterMain$3Answer" 
    value="N" onclick="return answeredno(3,&#39;desc&#39;);" />
  <label for="masterMain_3Answer_1">N</label>
</td>

在我的提交按钮的 OnClick 函数中,我想根据用户的输入收集是否选择了 Y 或 N。

这是我到目前为止所写的:

      RadioButton _rbAnswer = new RadioButton();
      RadioButtonList _rbList = new RadioButtonList();


     ContentPlaceHolder cp = (ContentPlaceHolder)Master.FindControl("masterMain");
     _rbAnswer = (RadioButton)Master.FindControl("masterMain_3Answer_0");
     HtmlInputRadioButton rb = (HtmlInputRadioButton)Master.FindControl("masterMain_3Answer_0");


     _rbAnswer = (RadioButton)cp.FindControl("masterMain_3Answer_0");
     _rbList = (RadioButtonList)cp.FindControl("masterMain_3Answer_0");

我能够毫无问题地获取 ContentPlaceHolder,但其余对象在尝试获取 . 我也尝试删除“masterMain_”,但仍然不想找到控件。

这是添加单个单选按钮列表的代码

                TableRow _tempRow = new TableRow();
                TableCell _cellOK = new TableCell();


                 RadioButtonList _rbList = new RadioButtonList();
                _rbList.ID = r[0].ToString()+"Answer";
                _rbList.RepeatDirection = RepeatDirection.Horizontal;

                //add options for yes or no
                 ListItem _liOk = new ListItem();
                _liOk.Value = "Y";
                 ListItem _linotOk = new ListItem();
                _linotOk.Value = "N";
                _rbList.Items.Add(_linotOk);

                //add cell to row
                _rbList.Items.Add(_liOk);
                _cellOK.Controls.Add(_rbList);
                _tempRow.Cells.Add(_cellOK);

                 //add the row to the table
                 stdtable.Rows.Add(_tempRow);
4

4 回答 4

2

为了能够快速找到动态创建的控件,请在页面类中添加一个字典:

private Dictionary<string, Control> fDynamicControls = new Dictionary<string, Control>();

然后在代码中创建新控件并分配其 ID 时:

fDynamicControls.Add(newControl.ID, newControl);

当您需要控件的参考时:

Control c = fDynamicControls["controlIdThatYouKnow"];
于 2012-12-21T19:42:09.160 回答
0

鉴于您的更新,您会发现您的控制层次结构相当深。您在表格内的一行内的单元格内有一个 RadioButtonList ...

FindControl 是一种需要在特定对象上调用的方法,并且只能找到该对象的实际子对象。在这种情况下,您要么需要构建递归方法,要么直接转到相关控件。由于这些控件中有很多是动态生成的,因此您无法直接访问它们,因此构建递归函数可能是最简单的。但是,在非常大的页面上,此方法可能非常消耗资源:

public static WebUserControl FindControlRecursive(this WebUserControl source, string name) 
{
    if (source.ID.Equals(name, StringComparison.Ordinal))
        return source;

    if (!source.Controls.Any()) return null;

    if (source.Controls.Any(x => x.ID.Equals(name, StringComparison.Ordinal))
        return source.FindControl(name);

    WebUserControl result = null;

    // If it falls through to this point then it 
    // didn't find it at the current level
    foreach(WebUserControl ctrl in source.Controls)
    {
        result = ctrl.FindControlRecursive(name);
        if (result != null) 
            return result;
    }

    // If it falls through to this point it didn't find it
    return null;
}

这是一个扩展方法,允许您在 ContentPlaceHolder 控件上调用它:

var _cp = (ContentPlaceHolder)Master.FindControl("masterMain");
RadioButtonList _rbList = _cp.FindControlRecursive("3Answer");

if (_rbList != null)
   // ... Found it

注意:将以上内容视为伪代码。我还没有在任何地方实现它,因此可能(可能)需要调整才能完全正确。

于 2012-12-21T19:27:57.323 回答
0

使用 FindControl 时不要使用页面生成的 id。使用您在 aspx.xml 中指定的 ID。

如果这是在一个Repeater 或另一个DataBound 控件内,则必须首先找到当前记录。(GridViewRow 或 RepeaterItem)首先,使用该项目的 .FindControl 函数。

请参阅此(不同 - 不重复)问题以查看如何执行此操作的代码示例:How to find control with in repeater on button click event and repeater is placed with in gridview in asp.net C#

于 2012-12-21T18:12:41.623 回答
0

当您创建动态控制器时,请为它们提供特定的 ID。这有助于使用我们自己的 id 生成控件。因此,我们可以使用此 ID 访问控件。

并且还使用 OnInit 生命周期事件来生成动态控制器,这是生成它们的最佳位置。

 RadioButton _rbAnswer = new RadioButton();
 _rbAnswer.ID="ranswerid";
于 2012-12-21T18:33:28.420 回答