2016-07-19 4 views
1

У меня есть веб-приложение 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 никогда не попадал.

Что я делаю неправильно?

ответ

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

Это работает. Могу ли я назначить вас на какой-то приз? Теперь, можете ли вы сказать мне, ПОЧЕМУ это работает? Я бы это понял, если без DataBind появятся кнопки NEVER, но в первый раз да, второй раз нет, в третий раз да ??? И вообще, СПАСИБО! – Melanie

+1

На самом деле я не могу точно сказать, почему, но я предполагаю, что перезагрузка страницы (вторая кнопка) имеет тот же эффект, что и «DataBind()», и поэтому нам разрешено добавлять кнопки во вторую попытку. Или 'DataBind()' вызывается под капотом после перезагрузки страницы. Добро пожаловать! – soumer

Смежные вопросы