0

我像这样实现了一个新的动态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 经典:

<%@ 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 实际上是包裹在 User Control 中的:

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

    private sealed class CustomItemTemplate : ITemplate
    {...}

}
4

1 回答 1

0

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

我没有看到使按钮导致它们所在的模板对象引发其ItemCommand事件。

就像我说的,这有点超出我的经验,所以也许这应该是自动接线的。但我会尝试处理按钮的Command事件并让它们引发ItemCommand模板。

ETA:阅读了一些资料后,我认为 Luizgrs 是对的,您不需要进行特殊的事件处理。

我现在想知道问题是否在于您container.Controls直到最后才添加任何控件。通过这种方式,您依赖于通过控制层次结构的Add方法并将所有 Command 事件与.container.ControlsTableBubbleEvent

作为一个实验,试着移动这条线:

 container.Controls.Add(ItemTable);

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

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

不同之处在于您添加的所有控件现在都将添加到已在内部的控件container.Controls

埃塔:还有!您需要为按钮分配一个 ID!

    ImageButton ImgBtnfvPrincipalInsertMode = new ImageButton();
    ImgBtnfvPrincipalInsertMode.ID = "ImgBtnfvPrincipalInsertMode";
    ImgBtnfvPrincipalInsertMode.CausesValidation = false;
    ImgBtnfvPrincipalInsertMode.ImageUrl = "~/Images/icon_insert_16.gif";
    ImgBtnfvPrincipalInsertMode.CommandName = "New";
于 2014-10-06T12:22:21.620 回答