2014-10-06 6 views
0

я реализовал новый динамический ItemTemplate как это:События от динамического ItemTemplate не поймало

private sealed class CustomItemTemplate : ITemplate 
{ 
    public CustomItemTemplate() 
    {} 

    void ITemplate.InstantiateIn(Control container) 
    { 
     Table ItemTable = new Table(); 
     ItemTable.CssClass = "tablewidth"; 

     TableRow btnRow = new TableRow(); 
     ItemTable.Rows.Add(btnRow); 

     TableCell btnCell = new TableCell(); 
     btnCell.CssClass = "bgcolorBlueLight"; 
     btnCell.ColumnSpan = 2; 

     btnRow.Cells.Add(btnCell); 

     ImageButton ImgBtnfvPrincipalInsertMode = new ImageButton(); 
     ImgBtnfvPrincipalInsertMode.CausesValidation = false; 
     ImgBtnfvPrincipalInsertMode.ImageUrl = "~/Images/icon_insert_16.gif"; 
     ImgBtnfvPrincipalInsertMode.CommandName = "New"; 

     ImageButton ImgBtnfvPrincipalUpdateMode = new ImageButton(); 
     ImgBtnfvPrincipalUpdateMode.CausesValidation = false; 
     ImgBtnfvPrincipalUpdateMode.ImageUrl = "~/Images/icon_edit_16.gif"; 
     ImgBtnfvPrincipalUpdateMode.CommandName = "Edit"; 

     btnCell.Controls.Add(ImgBtnfvPrincipalInsertMode); 
     btnCell.Controls.Add(ImgBtnfvPrincipalUpdateMode); 

     container.Controls.Add(ItemTable); 
    } 
    } 

Он содержит две кнопки, первое открытие в режиме вставки и второе открытие режим обновления один. Они появляются без проблем.

Моя цель состоит в том, чтобы использовать его в FormView:

protected void Page_Load(object sender, EventArgs e) 
{ 
    formView1.ItemTemplate = new CustomItemTemplate(); 
} 

И я хотел бы, чтобы поймать команды из двух кнопок:

protected void formView1_ItemCommand(object sender, FormViewCommandEventArgs e) 
{ 
    System.Diagnostics.Debug.WriteLine("ITEM COMMANDNAME : " + e.CommandName); 
} 

К сожалению, formView1_ItemCommand ничего не когда отображения Я нажимаю на свои кнопки

Тем не менее, если я объявляю ItemTemplate classicy:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ProspectsCustomFormView.ascx.cs" Inherits="controls_ProspectsCustomFormView" %> 

<asp:FormView ID="formView1" runat="server" OnItemCommand="formView1_ItemCommand"> 
<ItemTemplate> 
    <asp:Table ID="ItemTable" runat="server" CssClass="tablewidth"> 
     <asp:TableRow> 
      <asp:TableCell CssClass="bgcolorBlueLight" ColumnSpan="2"> 
       <asp:ImageButton ID="ImgBtnfvPrincipalInsertMode" runat="server" CommandName="New" CausesValidation="False" ImageUrl="~/Images/icon_insert_16.gif" ToolTip="New"/> 
       <asp:ImageButton ID="ImgBtnfvPrincipalUpdateMode" runat="server" CommandName="Edit" CausesValidation="False" ImageUrl="~/Images/icon_edit_16.gif" ToolTip="Edit" /> 
      </asp:TableCell> 
     </asp:TableRow> 
    </asp:Table> 
</ItemTemplate> 
</asp:FormView> 

Тогда это работает ...

Какое решение вы предлагаете?

EDIT

Забыла упомянуть FormView фактически завернуты внутри пользовательского элемента управления:

public partial class controls_CustomFormView : UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     fv.ItemTemplate = new CustomItemTemplate(); 
    } 

    private sealed class CustomItemTemplate : ITemplate 
    {...} 

} 
+0

Он работает здесь, вы уверены, что ItemCommand привязан? Событие должно пузыриться по умолчанию ... – Luizgrs

+0

Luizgrs: что вы подразумеваете под «ItemCommand binded»? – codablank1

+0

Вы видите что-то подобное в своем aspx? Luizgrs

ответ

0

Это немного вне моего опыта, но я отмечаю не показывать кнопки в вашем шаблоне. Кажется, вы не обрабатываете события, вызванные командами кнопок.

Нет ничего, что я вижу, чтобы кнопки вызывали объект шаблона, в котором они живут, чтобы поднять его событие ItemCommand.

Как я уже сказал, это немного вне моего опыта, поэтому, возможно, это должно быть самопроволочным. Но я бы попытался обработать событие «Command» и поднять их до ItemCommand шаблона.

ETA: Сделав некоторое чтение, я думаю, что Luizgrs прав, и вам не нужно делать специальные обработки событий.

Мне интересно, если проблема заключается в том, что вы не добавляете никаких элементов управления в container.Controls до самого конца. Поступая таким образом, вы полагаетесь на метод Addcontainer.Controls, чтобы пройти через иерархию управления Table и подключить все события команды с помощью BubbleEvent.

Просто в качестве эксперимента, попробуйте переместить эту строку:

container.Controls.Add(ItemTable); 

... до самого верха, как это:

Table ItemTable = new Table(); 
ItemTable.CssClass = "tablewidth"; 
container.Controls.Add(ItemTable); 

разница была в том, что все ваши добавления контроля бы сейчас быть в контроле уже внутри container.Controls.

ETA: ТАКЖЕ! Вам нужно назначить идентификатор кнопкам!

ImageButton ImgBtnfvPrincipalInsertMode = new ImageButton(); 
    ImgBtnfvPrincipalInsertMode.ID = "ImgBtnfvPrincipalInsertMode"; 
    ImgBtnfvPrincipalInsertMode.CausesValidation = false; 
    ImgBtnfvPrincipalInsertMode.ImageUrl = "~/Images/icon_insert_16.gif"; 
    ImgBtnfvPrincipalInsertMode.CommandName = "New"; 
+0

Команды событий в ASP.NET пузыри по иерархии http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.command(v=vs.110).aspx – Luizgrs

+0

@Ann L., поэтому вы предлагаете обрабатывать события внутри instantiatein? Не могли бы вы привести пример? – codablank1

+0

@Luizgrs Проделав некоторое чтение, я думаю, что вы правы. Я изменил свой ответ с другой идеей. –

 Смежные вопросы

  • Нет связанных вопросов^_^