0

一連のLinkBut​​tonを持つユーザーコントロールを作成しています。

クラスの上部にあるすべてのリンクボタンを宣言しました

LinkButton LB1 = new LinkButton();
LinkButton LB2 = new LinkButton();
//...
LinkButton LB9 = new LinkButton();

今度は、これらすべてのリンクボタンにアクセスするためのループを作成できるようにしたいので、毎回すべてを書き出す必要はありません。

オーバーライドされたCreateChildControls()メソッド内で次のようなことを試しました。

for (int i = 1; i < 10; i++)
        {
            LinkButton lb = (LinkButton)FindControl("LB" + i.ToString());
            lb.Text = i.ToString() + "-Button";
        }

lb.Text...がオブジェクトのインスタンスに設定されていないという例外が発生し続けます。

また、LB1、LB2などのすべての有効なIDを与えてみました。

すなわち:LB1.ID = "LB1";

まだサイコロではありません。

これどうやってするの?

4

5 に答える 5

1

FindControlこれらのコントロールがコレクションに追加された場合にのみ機能し、それはメソッドControls内でのみ発生します。OnInitしたがって、LB1、LB2などのコントロールがControlsコレクションに追加されておらず、FindControlがを返すため、例外が発生しますnull

これを行う1つの方法はList<LinkButton>、を使用してから、Initイベントハンドラーでコントロールをリストに追加することです。

別の方法として、LINQを使用して子コントロールをループすることができます。

var ctrls = Controls.OfType<LinkButton>();

このバージョンはすべての コントロールを返すLinkButtonので、それがまさにあなたが望むものであるかどうかはわかりません。繰り返しますが、これはInitイベントまたはページサイクルの後半でのみ機能します。

さらに

ページの構造によっては、 Repeaterコントロールを使用した方がよい場合があります。.aspx / ascxファイルに次のようなものがあります:

<asp:Repeater ID="repeater" runat="server">
    <ItemTemplate>
        <asp:LinkButton ID="btn" runat="server" />
    </ItemTemplate>
</asp:Repeater>

次に、コードビハインドで、データバインディングを使用して配列を設定します。

于 2010-05-20T23:38:46.730 に答える
0

それは間違いなくLinkBut​​tonを見つけていますか?FindControlが実際にLinkBut​​tonを見つけていないように見えます。

デバッガーを接続し、lbが実際にnullでないことを確認します。

于 2010-05-20T23:38:09.087 に答える
0

FindControlは、直接のコンテナー内のコントロールのみを返すと思います。したがって、たとえばDIV要素またはテーブル内にコントロールがある場合、それらは検出されません。次のようなヘルパー関数を使用できます。

public static Control FindControl(Control start, string id)
{
  Control foundControl;
  if (start != null) 
  {
    foundControl = start.FindControl(id);
    if (foundControl != null) 
      return foundControl;

    foreach (Control c in start.Controls) 
    {
      foundControl = FindControl(c, id);
      if (foundControl != null) 
        return foundControl;
    }
  }
  return null;
}

次に、このコンテナまたは特定のコンテナを開始パラメータとして渡すことができます。

于 2010-05-20T23:40:45.960 に答える
0

このようなものはどうですか?

    int btnCount = 10;
    LinkButton[] btns = new LinkButton[btnCount];
    for (int i = 1; i <= btnCount; i++)
    {
        btns[i - 1] = new LinkButton(){
            Text = string.Format("{0} - Button", i) 
        };
    }
于 2010-05-20T23:44:12.380 に答える
0

@Alekと@codekaが述べたように、FindControlは、Pageオブジェクトなどのコンテナーに追加された後にのみ機能します。

あなたができることは、それらをそれぞれ変数として宣言する代わりに、代わりにそれらをリストに追加することです。

var linkButtonList = new List<LinkButton>();
linkButtonList.Add(new LinkButton());
linkButtonList.Add(new LinkButton());
etc..

そうすれば、すべてのLinkBut​​tonコントロールにアクセスする必要があるときはいつでも、リストを簡単にループできます。

foreach (var item in linkButtonList)
{
    // do something with the LinkButton here...
}
于 2010-05-20T23:46:38.770 に答える