以编程方式将新建按钮添加到 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;
}
}
我有一个 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;
}
}