【问题标题】:Programmatically add New button to ASP.Net DetailsView以编程方式将新按钮添加到 ASP.Net DetailsView
【发布时间】:2016-11-22 14:06:57
【问题描述】:

我有一个 ASP.Net 4.5.1 Web 应用程序,它有一个带有 GridView 和 DetailsView 的页面。这两个控件是链接在一起的,因此当在 GridView 中单击 Select 按钮时,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,但它们不显示。

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

<%@ 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 方法。

我做错了什么?

【问题讨论】:

    标签: c# asp.net gridview detailsview


    【解决方案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;
        }
    }
    

    【讨论】:

    • 那行得通。我可以提名你获得某种奖项吗?现在,你能告诉我为什么它有效吗?如果没有DataBind,按钮永远不会出现,我会理解的,但第一次是,第二次不是,第三次是???无论如何,谢谢!!
    • 我实际上不能确切地告诉你为什么,但我认为页面重新加载(第二个按钮单击)与DataBind() 具有相同的效果,因此我们可以在第二次尝试。或者 DataBind() 在页面重新加载后被调用。不客气!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    相关资源
    最近更新 更多