1

コード ビハインド ファイルで ASP.Net DetailsView を VB.Net と共に使用して、ユーザーがデータを挿入するときにデータ入力を簡単に行えるようにしたいと考えています。

「新規」ボタンをクリックする前に、DetailsView が特定のフィールドの値を記憶する方法を実装したいと考えています。値を記憶した後、[新規] をクリックした後、DropDownList フィールドと TextBox フィールドの 2 つのフィールドに記憶した値を入力します。

現在、コード ビハインド ファイルでこれを試しました。

Protected Sub DetailsViewDetails_ItemCommand(sender As Object, e As System.Web.UI.WebControls.DetailsViewCommandEventArgs)

    Select Case e.CommandName

        Case "Add"

        Case "Edit"
            ButtonAddNewAttendance.Enabled = False

        Case "Delete"

        Case "Update"
            ButtonAddNewAttendance.Enabled = True

        Case "Insert"

        Case "New"
            Dim txtBox As New TextBox
            txtBox = DetailsView.FindControl("TextBoxDateAttendanceTakenInsert")
            txtBox.Text = DateTime.Now

            Dim drpValue As DropDownList
            drpValue = DetailsView.FindControl("DropDownListClassInsert")
            drpValue.SelectedValue = 1
    End Select
End Sub 

[新規] ボタンをクリックすると、次のエラーが表示されます。

System.NullReferenceException was unhandled by user code
Message=Object reference not set to an instance of an object.

このエラーは txtBox.Text = DateTime.Now にあります

マークアップからフィールドが見つからないかのようです。コーディングに他に何を追加する必要があるか教えていただけますか?

TextBox のコーディングをコメントアウトし、DropDownList のコーディングをそのままにしておくと、同じエラーが発生します。

2 つのフィールドを示すマークアップを次に示します。

<asp:DetailsView 
    ID="DetailsView" 
    runat="server" 
    AutoGenerateRows="False" 
    Height="50px" 
    Width="207px" 
    DataSourceID="SqlDataSourceDetails"
    DataKeyNames="ID"
    OnItemCommand="DetailsViewDetails_ItemCommand">

<Fields>

<asp:TemplateField HeaderText="Class:" SortExpression="ClassID">
    <EditItemTemplate>

        <asp:DropDownList 
            ID="DropDownListClassEdit" 
            Runat="server"
            DataSourceID="SqlDataSourceClasses"
            DataTextField = "ClassName"
            DataValueField="ID"
            SelectedValue='<%# Bind("ClassID") %>'
            ForeColor="Blue">
        </asp:DropDownList>

        <asp:RequiredFieldValidator ID="RequiredFieldValidatorEditClass" runat="server" ControlToValidate="DropDownListClassEdit" 
             ErrorMessage="Please select a Class here." Font-Bold="True" Font-Italic="True" ForeColor="Red" 
             SetFocusOnError="True" Display="Dynamic">

         </asp:RequiredFieldValidator>

     </EditItemTemplate>

     <InsertItemTemplate>

         <asp:DropDownList 
             ID="DropDownListClassInsert" 
             Runat="server"
             DataSourceID="SqlDataSourceClasses"
             DataTextField = "ClassName"
             DataValueField="ID"
             SelectedValue='<%# Bind("ClassID") %>'
             AppendDataBoundItems="True"
             ForeColor="Blue">
         </asp:DropDownList>

         <asp:RequiredFieldValidator ID="RequiredFieldValidatorInsertClass" runat="server" ControlToValidate="DropDownListClassInsert" 
             ErrorMessage="Please select a Class here." Font-Bold="True" Font-Italic="True" ForeColor="Red" 
             SetFocusOnError="True" Display="Dynamic">

         </asp:RequiredFieldValidator>
     </InsertItemTemplate>

     <ItemTemplate>

         <asp:DropDownList 
             ID="DropDownListClass" 
             Runat="server"
             DataSourceID="SqlDataSourceClasses"
             DataTextField = "ClassName"
             DataValueField="ID"
             SelectedValue='<%# Bind("ClassID") %>'
             Enabled="false"
             ForeColor="Blue"
             Font-Bold="true"> 
         </asp:DropDownList>

     </ItemTemplate>
 </asp:TemplateField>

 <asp:TemplateField 
     HeaderText="Attendance Date:" SortExpression="DateAttendanceTaken">
     <EditItemTemplate>
         <asp:TextBox 
             ID="TextBoxDateAttendanceTakenEdit" 
             runat="server" 
             Text='<%# Bind("DateAttendanceTaken", "{0:MM/dd/yyyy}") %>'>
         </asp:TextBox>
     </EditItemTemplate>

     <InsertItemTemplate>
         <asp:TextBox 
             ID="TextBoxDateAttendanceTakenInsert" 
             runat="server" 
             Text='<%# Bind("DateAttendanceTaken", "{0:MM/dd/yyyy}") %>'>
         </asp:TextBox>
     </InsertItemTemplate>

     <ItemTemplate>
         <asp:Label 
             ID="LabelDateAttendanceTaken" 
             runat="server" 
             Text='<%# Bind("DateAttendanceTaken", "{0:MM/dd/yyyy}") %>'>
         </asp:Label>
     </ItemTemplate>

     <ItemStyle ForeColor="Blue" />
 </asp:TemplateField>

今のところ、値を次のようにハードコーディングしました。

drpValue.SelectedValue = 1

コーディングが機能するようになるまで。

* アップデート *

ItemCommand は、コーディングを配置する正しい場所ではありません。

これを機能させるには、ここに示すように OnDataBinding を追加する必要があり、さらに、以下に示すように分離コード ファイルにハンドラーがあることを確認する必要があることがわかりました。

InsertItemTemplate マークアップ:

<InsertItemTemplate>
    <asp:DropDownList 
        ID="DropDownListClassInsert" 
        Runat="server"
        DataSourceID="SqlDataSourceClasses"
        DataTextField = "ClassName"
        DataValueField="ID"
        SelectedValue='<%# Bind("ClassID") %>'
        AppendDataBoundItems="True"
        ForeColor="Blue"
        OnDataBinding="DropDownListClassInsert_DataBinding">
    </asp:DropDownList>

    <asp:RequiredFieldValidator ID="RequiredFieldValidatorInsertClass" runat="server" ControlToValidate="DropDownListClassInsert" 
        ErrorMessage="Please select a Class here." Font-Bold="True" Font-Italic="True" ForeColor="Red" 
        SetFocusOnError="True" Display="Dynamic">
    </asp:RequiredFieldValidator>
</InsertItemTemplate>

コード ビハインド ファイルのハンドラー:

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

    Dim drpValue As DropDownList
    drpValue = DetailsView.FindControl("DropDownListClassInsert")
    drpValue.SelectedValue = intCurrentClassID
End Sub

注: intCurrentClassID は次のように宣言されます。

Public Shared intCurrentClassID As Integer = Nothing

後:

Public Class

これが同じ問題を抱えている他の人に役立つことを願っています。

4

0 に答える 0