以编程方式将新建按钮添加到 ASP.Net DetailsView

Programmatically add New button to ASP.Net DetailsView

我有一个 ASP.Net 4.5.1 Web 应用程序,它有一个页面,其中包含一个 GridView 和一个 DetailsView。这两个控件是链接的,因此当在 GridView 中单击 Select 按钮时,DetailsView 会显示该行的数据。 DetailsView 记录有一个编辑按钮和一个删除按钮。这一切都很好。但是,我不想在 DetailsView 的底部添加“新建”按钮以及“编辑”和“删除”按钮。我看不出有任何理由让我的用户在将新记录输入数据集之前必须 select 现有记录。

所以 - 我在页面顶部创建了一个名为 btnNew 的 ASP 按钮。这个按钮应该做的是打开 DetailsView 并将其模式更改为 Insert。我在 DetailsView FooterTemplate 中有两个按钮,btnInsert 和 btnCancel。默认情况下它们是不可见的,但我在单击 btnNew 时使它们可见。

问题是:当我第一次单击 btnNew 时,DetailsView 在插入模式下打开,并且 btnInsert 和 btnCancel 正确显示。但是,如果我单击 btnCancel(DetailsView 和两个按钮消失,一切都很好)然后再次单击 btnNew,DetailsView 会出现,但 btnInsert 和 btnCancel 不会。如果我第二次单击 btnNew,它们就会出现。如果我将 btnNew_Click 中将 DetailsView 模式更改为 Insert 的行移动到方法的底部,那么当我第一次单击 btnNew 时,我看不到 btnInsert 和 btnCancel,但是当我第二次点击它,它们出现了。当我在调试模式下浏览代码时,找到了 btnInsert 和 btnCancel,并且它们的 Visible 属性 设置为 True,但它们没有显示。

我已将我的代码简化为只有 DetailsView(没有 GridView)的页面,没有数据绑定,没有母版页,没有 Ajax 控件,但问题行为仍然存在。下面是这个简化的代码。首先是我的标记:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SimpleDefault.aspx.cs" Inherits="ElectronicCaseFilingHistory.SimpleDefault" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:Button runat="server" ID="btnNew" Text="Add New" OnClick="btnNew_Click" BackColor="#F8F8F8" BorderColor="#9BE8E8" ForeColor="#3C3C3C" />
    <asp:DetailsView runat="server" ID="dvFilingDetail" AutoGenerateRows="false" >
        <Fields>
            <asp:TemplateField HeaderText="Attorney" HeaderStyle-Font-Bold="true">
                <ItemTemplate>
                    <asp:Label runat="server" ID="lbAttorneyName" />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox runat="server" ID="tbAttorneyName" />
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Court" HeaderStyle-Font-Bold="true">
                <ItemTemplate>
                    <asp:Label runat="server" ID="lbCourt" />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox runat="server" ID="tbCourt" />
                </EditItemTemplate>
            </asp:TemplateField>
        </Fields>
        <FooterTemplate>
            <asp:Button runat="server" ID="btnInsert" Visible="false" Text="Insert" />
            <asp:Button runat="server" ID="btnCancel" Visible="false" OnClick="btnCancel_Click" Text="Cancel" />
        </FooterTemplate>
    </asp:DetailsView>
    </div></form></body></html>

现在后面的代码:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ElectronicCaseFilingHistory
{

public partial class SimpleDefault : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void btnNew_Click(object sender, EventArgs e)
    {
        dvFilingDetail.ChangeMode(DetailsViewMode.Insert);  
        Button insert = (Button)dvFilingDetail.FindControl("btnInsert");
        Button cancel = (Button)dvFilingDetail.FindControl("btnCancel");
        if (insert != null)
            insert.Visible = true;
        if (cancel != null)
            cancel.Visible = true;  
    }

    protected void btnCancel_Click(object sender, EventArgs e)
    {
        dvFilingDetail.ChangeMode(DetailsViewMode.ReadOnly);
        dvFilingDetail.DataBind();
    }
}
}

除了 EditItemTemplate 之外,我还尝试添加 InsertItemTemplate,但这没有任何效果。我还在 btnNew 中添加了 CommandName=New,并在 DetailsView 中添加了一个 ItemCommand 事件来尝试这样做,但从未命中 ItemCommand 方法。

我做错了什么?

DetailsViewMode 更改为 Insert 后,您还必须调用 DataBind();

protected void btnNew_Click(object sender, EventArgs e)
{
    dvFilingDetail.ChangeMode(DetailsViewMode.Insert);
    dvFilingDetail.DataBind();

    Button insert = (Button)dvFilingDetail.FindControl("btnInsert");
    Button cancel = (Button)dvFilingDetail.FindControl("btnCancel");
    if (insert != null)
    {
        insert.Visible = true;
    }
    if (cancel != null)
    {
        cancel.Visible = true;
    }
}