В некоторых случаях добавьте дополнительный элемент управления меткой к <ItemTemplate>динамически - PullRequest
1 голос
/ 14 декабря 2010

Как я могу добавить дополнительный элемент управления меткой динамически (должен добавляться только при определенных условиях). Я пытаюсь сделать что-то вроде этого:

 <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>  

но безрезультатно. Любые советы о том, как я могу создать Placeholder только в некоторых случаях (например, для некоторых значений Column1 / Column2), вместо того, чтобы выбрать подход с повторителем ... Я получаю исключение нулевой ссылки, но это было решено, когда мне пришлось явно упомянуть:

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;

}

1 Ответ

1 голос
/ 14 декабря 2010

Где и когда вам нужно вставить дополнительный элемент управления?

Скорее всего, вы должны подключить метод к событию 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";
}

Кстати, вы не можете добавлять какие-либо элементы управления в Label, ваш 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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...