私は、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メソッドは決してヒットしませんでした。
私は間違っていますか?
これは機能します。何らかの賞品のためにあなたを指名することはできますか?さて、あなたはそれがなぜ機能するのか教えていただけますか?私は、DataBindなしで、ボタンが表示されなかった場合、最初の時間はい、2番目の時間はない、3番目の時間はい、それを理解するだろうか?とにかく、ありがとう! – Melanie
私は実際にあなたに正確にそれを伝えることはできませんが、ページリロード(2回目のボタンクリック)は 'DataBind()'と同じ効果があると仮定して、2回目の試みでボタンを追加することができます。または、 'DataBind()'は、ページのリロード後にフードの下で呼び出されます。どういたしまして! – soumer