コード ビハインド ファイルで 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
これが同じ問題を抱えている他の人に役立つことを願っています。