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

时间:2016-07-19 15:21:17

标签: c# asp.net gridview detailsview

我有一个ASP.Net 4.5.1 Web应用程序,它有一个带有GridView和DetailsView的页面。这两个控件是链接的,因此当在GridView中单击“选择”按钮时,DetailsView将显示该行的数据。 DetailsView记录具有“编辑”和“删除”按钮。一切正常。但是,我不想在DetailsView的底部添加一个New按钮以及Edit和Delete按钮。我没有看到为什么我的用户在将新记录输入数据集之前必须选择现有记录的原因。

所以 - 我在页面顶部创建了一个名为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,并将一个ItemCommand事件添加到DetailsView以尝试以这种方式执行,但ItemCommand方法从未被命中。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

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