2

VB.Net コード ビハインド ファイルを使用して ASP.Net DetailsView を使用しています。ユーザーが [編集] ボタンをクリックしてから [更新] ボタンをクリックできるようにすることで、ユーザーが DetailsView で変更を編集および保存できるようにしようとしています。

ユーザーが [編集] ボタンをクリックしても何も起こらないため、[編集] ボタンの OnClick ハンドラーを追加しました。DetailsView は編集モードになりますが、ユーザーが [編集] ボタンを 2 回クリックした場合のみです。(おそらく ASP.Net のバグでしょうか?)

DetailsView が編集モードになると、[更新] ボタンと [キャンセル] ボタンが期待どおりに表示されますが、ユーザーがこれらのボタンのいずれかをクリックしても何も起こりません。DetailsView を強制的に更新するために [更新] ボタンに OnClick を配置しましたが、.ChangeMode(DetailsViewMode. の唯一の選択肢は Edit、Insert、ReadOnly です。

また、特別な処理を実行する必要がない限り、DetailsViews に追加の OnClicks は必要ないと考えました。

DetailsView のマークアップは次のとおりです。

<asp:DetailsView 
    ID="DetailsView" 
    runat="server" 
    Height="50px" 
    Width="218px" AutoGenerateRows="False">

    <Fields>

        <asp:TemplateField ShowHeader="False">

            <EditItemTemplate>
                <asp:Button ID="ButtonUpdate" runat="server" CausesValidation="True" 
                    CommandName="Update" Text="Update" OnClick="ButtonUpdate_Click"  />
                &nbsp;<asp:Button ID="ButtonCancelUpdate" runat="server" CausesValidation="False" 
                    CommandName="Cancel" Text="Cancel" />
            </EditItemTemplate>

            <ItemTemplate>
                <asp:Button ID="ButtonEdit" runat="server" CausesValidation="False" 
                    CommandName="Edit" Text="Edit" OnClick="ButtonEdit_Click"/>
            </ItemTemplate>
        </asp:TemplateField>

        <asp:BoundField DataField="Forename" HeaderText="First Name:" />
    </Fields>
</asp:DetailsView>

コード ビハインド ファイルのコーディングは次のとおりです。

Public Class StudentDetailsMaintenance
    Inherits System.Web.UI.Page

    Dim theTableAdapter As New DataSetSingleStudentTableAdapters.StudentsMaintenanceTableAdapter

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        ' Load the data from the database into the DetailsView.
        '------------------------------------------------------
        DetailsView.DataSource = theTableAdapter.GetDataByStudentID(StudentMaintenance.IntStudentID)
        DetailsView.DataBind()
    End Sub

    Protected Sub ButtonEdit_Click(sender As Object, e As EventArgs)

        ' Place the DetailsView into Edit mode.
        '--------------------------------------
        DetailsView.ChangeMode(DetailsViewMode.Edit)
    End Sub

    Protected Sub ButtonUpdate_Click(sender As Object, e As EventArgs)

        ' Place the DetailsView into Update mode.
        '----------------------------------------
        DetailsView.ChangeMode(DetailsViewMode.)
    End Sub
End Class

DetailsView を取得して更新を行う方法がわからないため、ButtonUpdate_Click ルーチンは不完全です。

追記: マークアップで DataSource を設定せずに DetailsView を実行しようとするのはこれが初めてです。その代わりに、DataSet デザイナーで作成された DataSet TableAdapter からのデータを使用しています。

マークアップですべて DataSource と共に DetailsView を実行した場合、[編集] ボタンと [更新] ボタンは問題なく機能します。また、可能であれば余分なコーディングを排除するためにこれを行っていました。

4

2 に答える 2

3

Edit に対して DetailsView の自動動作が必要な場合は、CommandField を使用して [Edit] ボタンを表示する必要があります。

<asp:DetailsView id="dvDetailsView" runat="server" DataSourceId="sqlDS" DataKeyNames="primaryKey">
  <Fields>
    <asp:CommandField ButtonType="Button" ShowEditButton="true" />
  </Fields>
</asp:DetailsView>

前述のように、データ ソースのどのレコードを更新するかを ASP.NET が認識できるように、データ ソースの主キーを指定する DataKeyNames プロパティを含める必要があります。また、前述のように、Bind("columnName") ステートメントがデータ ストアで使用されているものと同じフィールド名を使用していることを確認する必要があります。

また、更新が行われるように、SqlDataProvider (またはデータ ストアに相当するもの) で UpdateCommand を提供していることを確認してください。

DetailsView を編集モードにすると、[更新] ボタンと [キャンセル] ボタンが自動的に表示されます。データ ストアでデータを更新する前にデータを処理する必要がある場合は、コード ビハインドで DetailView の ItemUpdating イベントを処理します。

于 2014-06-03T16:56:52.913 に答える
2

簡単に言えば、Page_Load データバインドを If Not Page.IsPostback でラップしてみてください。

ポストバックは、データバインドされたコントロールに大混乱をもたらします。

于 2012-11-30T15:44:34.587 に答える