2016-07-19 10 views
1

私は、GridViewとDetailsViewを持つページを持つASP.Net 4.5.1 Webアプリケーションを持っています。 2つのコントロールがリンクされているため、GridViewで選択ボタンをクリックすると、DetailsViewはその行のデータを表示します。 DetailsViewレコードには、編集ボタンと削除ボタンがあります。これはすべて正常に動作します。ただし、Detailsビューの下部に[編集]ボタンと[削除]ボタンと一緒に[新規]ボタンを追加したくありません。データセットに新しいレコードを入力する前に、既存のレコードを選択する必要がある理由はありません。ASP.Net DetailsViewに新しいボタンをプログラムで追加します。

私は、ページ上部にbtnNewというASPボタンを作成しました。このボタンが行うことになっているのは、DetailsViewを開き、そのモードをInsertに変更することです。 DetailsView FooterTemplate、btnInsert、btnCancelに2つのボタンがあります。デフォルトでは表示されませんが、btnNewをクリックすると表示されます。

これは問題です。最初にbtnNewをクリックすると、DetailsViewが挿入モードで開き、btnInsertとbtnCancelが正しく表示されます。しかし、btnCancelをクリックすると(DetailsViewと2つのボタンがすべて消えてしまいます)、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> 

は今すぐ背後にあるコード:

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を追加しようとしたが、それは効果がありません。また、CommandName = NewをbtnNewに追加し、ItemCommandメソッドをDetailsViewに追加してそのようにしましたが、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なしで、ボタンが表示されなかった場合、最初の時間はい、2番目の時間はない、3番目の時間はい、それを理解するだろうか?とにかく、ありがとう! – Melanie

+1

私は実際にあなたに正確にそれを伝えることはできませんが、ページリロード(2回目のボタンクリック)は 'DataBind()'と同じ効果があると仮定して、2回目の試みでボタンを追加することができます。または、 'DataBind()'は、ページのリロード後にフードの下で呼び出されます。どういたしまして! – soumer

関連する問題