2016-07-19 2 views
1

GridView 및 DetailsView가있는 ASP.Net 4.5.1 웹 응용 프로그램이 있습니다. GridView에서 선택 버튼을 클릭하면 DetailsView에 해당 행의 데이터가 표시되도록 두 컨트롤이 연결됩니다. DetailsView 레코드에는 편집 및 삭제 단추가 있습니다. 이 모든 것이 잘 작동합니다. 그러나 편집 및 삭제 단추와 함께 DetailsView 아래쪽에 새 단추를 추가하고 싶지 않습니다. 내 사용자가 데이터 세트에 새 레코드를 입력하기 전에 기존 레코드를 선택해야하는 이유는 없습니다.프로그래밍 방식으로 ASP.Net DetailsView에 새 단추 추가

그래서 저는 페이지 상단에 btnNew라는 ASP 버튼을 만들었습니다. 이 단추는 DetailsView를 열고 해당 모드를 삽입으로 변경합니다. DetailsView FooterTemplate, btnInsert 및 btnCancel에 두 개의 버튼이 있습니다. 기본적으로 표시되지 않지만 btnNew를 클릭하면 표시됩니다.

처음에는 btnNew를 클릭하면 DetailsView가 삽입 모드로 열리고 btnInsert와 btnCancel이 제대로 표시됩니다. 그러나 btnCancel (DetailsView와 두 개의 버튼이 모두 사라지면)을 클릭하고 btnNew를 다시 클릭하면 DetailsView가 표시되지만 btnInsert와 btnCancel은 표시되지 않습니다. btnNew를 두 번 클릭하면 표시됩니다. 메서드의 맨 아래에 삽입하도록 DetailsView 모드를 변경하는 btnNew_Click (아래 참조)의 행을 이동하면 처음에는 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> 

이제 코드 : 내가 EditItemTemplate 이외에 InsertItemTemplate을 추가하는 시도했지만, 그 효과가 없습니다

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

. 또한 CommandName = New를 btnNew에 추가하고 ItemCommand 이벤트를 DetailView에 추가하여 그런 식으로 처리하려고 시도했지만 ItemCommand 메서드는 결코 적중되지 않았습니다.

내가 뭘 잘못하고 있니?

답변

1

DetailsViewModeInsert으로 변경 한 후에는 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없이 단추가 절대로 나타나지 않는다면 이해할 것이다. 그러나 처음으로 예, 두 번째로 아니오, 세 번째로 예 ??? 그리고 어쨌든, 감사합니다 !! – Melanie

+1

실제로 그 이유를 정확히 말할 수는 없지만, 페이지 리로드 (두 번째 버튼 클릭)가'DataBind()'와 같은 효과가 있다고 가정하므로 두 번째 시도에서 버튼을 추가 할 수 있습니다. 또는'DataBind()'는 페이지를 새로 고친 후에 호출됩니다. 천만에요! – soumer

관련 문제