1

追加のラベル コントロールを動的に追加するにはどうすればよいですか (特定の条件でのみ追加する必要があります)。私はこのようなことをしようとしています:

 <asp:DataGrid id="dg" runat="server" AutoGenerateColumns="false">
 <Columns>
    <asp:TemplateColumn SortExpression="Column1">
        <HeaderTemplate>
         <asp:LinkButton Runat="server" text="Column1 Hdr" ID="col1Hdr">
         </asp:LinkButton>
        </HeaderTemplate>
      <ItemTemplate> 
        <asp:Label ID="col1Label" runat="server" Text='<%# Method1(DataBinder.Eval(Container.DataItem, "Column1").ToString(), DataBinder.Eval(Container.DataItem, "Column2").ToString())  %>' >           
           <asp:PlaceHolder ID="col2Holder" runat="server"></asp:PlaceHolder> 
       </asp:Label> 
      </ItemTemplate>     
   </asp:TemplateColumn> 
 </Columns>
</asp:DataGrid>

または、プレースホルダーを別のテンプレートに入れてみました:

 <EditItemTemplate>
        <asp:PlaceHolder ID="col2Holder" runat="server"></asp:PlaceHolder> 
  </EditItemTemplate>  

しかし、役に立たない。リピーターアプローチを選択するのではなく、一部のケース (Column1/Column2 の一部の値など) でのみプレースホルダーを作成する方法に関するヒント... null 参照例外が発生しましたが、明示的に言及する必要があったときに解決されました:

protected PlaceHolder col2Holder = new Placeholder();

それ以外の

protected PlaceHolder col2Holder; 

しかし、method1 は 'Column1 のテキスト値を正しく設定できますが、Column2 の値に対しては何もしません...何か足りないものがありますか、それとも別の方法がありますか?

method1 の定義は次のとおりです。

public string Method1(string col1, string col2)
{
    col1 += "Called method1"; 
     Label col2label= new Label();

     col2label.Visible = true;
     col2label.Text = col2;         

     col2Holder.Controls.Add(col2label);
     col2Holder.DataBind();

return col1;

}

4

1 に答える 1

1

いつどこに追加のコントロールを挿入する必要がありますか?

ほとんどの場合、イベントにメソッドを接続しOnItemDataBound、そこでコントロールを追加するかどうかを決定する必要があります。イベントはあなたが言うことができるようにあなたにバインドされているアイテムへの参照を与えますe.Item.Controls.Add(your_control)

アップデート

ああ、今私はあなたが求めているものを手に入れました。Method1をとる別の引数を自分に追加する必要がありますDataGridItem。Method1を呼び出すときは、このように追加します。Method1(Container)ここで、は問題Containerのを参照しDataGridItemます。その後、あなたはで言うことができますMethod1

public string Method1(DataGridItem item)
{
    string col1 = DataBinder.Eval(item.DataItem, "Column1").ToString();
    string col2 = DataBinder.Eval(item.DataItem, "Column2").ToString();

    var col2label = new Label() { Visible = true, Text = col2 };
    var col2Holder = item.FindControl("col2Holder");

    col2Holder.Controls.Add(col2label);

    return col1 + "Called method1";
}

ところで、ラベルにコントロールを追加することはできません。ItemTemplateは次のようになります。

<ItemTemplate>
   <asp:Label ID="col1Label" runat="server" Text="<%# Method1(Container) %>" />
   <asp:PlaceHolder ID="col2Holder" runat="server" />
</ItemTemplate>

新しいラベルを最初のラベル内にネストする場合は、メソッドで明示的に行い、プレースホルダーを省略します。

<ItemTemplate>
   <asp:Label ID="label" runat="server" Text="<%# Method1(Container) %>" />
</ItemTemplate>

public string Method1(DataGridItem item)
{
    string col1 = DataBinder.Eval(item.DataItem, "Column1").ToString();
    string col2 = DataBinder.Eval(item.DataItem, "Column2").ToString();

    var label = item.FindControl("label");
    var col2label = new Label() { Visible = true, Text = col2 };

    col1Holder.Controls.Add(col2label);

    return col1 + "Called method1";
}
于 2010-12-14T00:57:26.987 に答える