来自动态ItemTemplate的事件未被捕获

时间:2014-10-06 11:01:43

标签: asp.net formview itemtemplate itemcommand

我实现了一个新的动态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);
    }
  }

它包含两个按钮,第一个打开插入模式,第二个打开更新模式。他们出现没问题。

我的目标是在形式视图中使用它:

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

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

然后它有用......

您建议使用哪种解决方案?     

修改

忘记提及formView实际上包含在用户控件中:

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

    private sealed class CustomItemTemplate : ITemplate
    {...}

}

1 个答案:

答案 0 :(得分:0)

这有点超出我的经验,但我注意到你没有在你的模板中显示你的按钮来引发事件。您似乎没有处理按钮命令引发的事件。

我没有看到让按钮导致他们所居住的模板对象引发其ItemCommand事件。

就像我说的,这有点超出我的经验,所以也许应该自动连接自己。但我会尝试处理按钮“Command”事件并让他们提升模板的ItemCommand

ETA:做过一些阅读后,我觉得Luizgrs是对的,你不需要做特殊的事件处理。

我现在想知道问题是你没有将任何控件添加到container.Controls直到最后。通过这种方式,您依靠Add的{​​{1}}方法来浏览container.Controls的控件层次结构,并使用Table连接所有命令事件

就像实验一样,尝试移动这一行:

BubbleEvent

...直到顶部,像这样:

 container.Controls.Add(ItemTable);

不同之处在于,您现在所有的控件添加内容都已存在于 Table ItemTable = new Table(); ItemTable.CssClass = "tablewidth"; container.Controls.Add(ItemTable); 内的控件中。

ETA:还有!您需要为按钮分配ID!

container.Controls