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を取得できますが、取得を試みた後、残りのオブジェクトはnullになります。また、「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

FindControlを使用するときは、ページによって生成されたIDを使用しないでください。aspxで指定したIDを使用します。

これがRepeaterまたは別のDataBoundコントロール内にある場合は、最初に現在のレコードを見つける必要があります。(GridViewRowまたはRepeaterItem)最初に、そのアイテムの.FindControl関数を使用します。

それを行う方法のコード例を確認するには、この(異なる-重複していない)質問を参照してください:ボタンクリックイベントのリピーターでコントロールを見つける方法とリピーターは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 に答える
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 に答える