У меня есть веб-приложение ASP.Net 4.5.1, в котором есть страница с GridView и DetailsView. Два элемента управления связаны друг с другом, поэтому, когда в GridView нажата кнопка «Выбрать», DetailsView отображает данные для этой строки. В записи DetailsView есть кнопка «Редактировать» и «Удалить». Все это прекрасно работает. Тем не менее, я не хочу добавлять новую кнопку в нижней части DetailsView вместе с кнопками «Редактировать» и «Удалить». Я не вижу причин, по которым мой пользователь должен будет выбрать существующую запись перед вводом новой записи в набор данных.Программно добавить новую кнопку в ASP.Net DetailsView
Так что, я создал кнопку ASP в верхней части страницы под названием btnNew. То, что должна делать эта кнопка, - это открыть DetailsView и изменить его режим на Insert. У меня есть две кнопки в FootViewTemplate DetailsView, btnInsert и btnCancel. По умолчанию они невидимы, но я делаю их видимыми при нажатии кнопки btnNew.
Вот проблема: когда я нажимаю на btnNew в первый раз, DetailsView открывается в режиме Insert, а btnInsert и btnCancel отображаются правильно. ОДНАКО, если я нажму на btnCancel (DetailsView и две кнопки исчезнут, все хорошо), а затем снова нажмите btnNew, появится DetailsView, но btnInsert и btnCancel этого не делают. Если я снова нажму btnNew, они появятся. Если я перемещаю строку в btnNew_Click (см. Ниже), которая меняет режим DetailsView, чтобы вставить нижнюю часть метода, тогда, когда я нажимаю на 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();
}
}
}
Я попытался добавления InsertItemTemplate в дополнение к EditItemTemplate, но это не имеет никакого эффекта. Я также добавил CommandName = New в btnNew и добавил ItemCommand событие в DetailsView, чтобы попытаться сделать это таким образом, но метод ItemCommand никогда не попадал.
Что я делаю неправильно?
Это работает. Могу ли я назначить вас на какой-то приз? Теперь, можете ли вы сказать мне, ПОЧЕМУ это работает? Я бы это понял, если без DataBind появятся кнопки NEVER, но в первый раз да, второй раз нет, в третий раз да ??? И вообще, СПАСИБО! – Melanie
На самом деле я не могу точно сказать, почему, но я предполагаю, что перезагрузка страницы (вторая кнопка) имеет тот же эффект, что и «DataBind()», и поэтому нам разрешено добавлять кнопки во вторую попытку. Или 'DataBind()' вызывается под капотом после перезагрузки страницы. Добро пожаловать! – soumer