コンピューター資産を追跡する ASP.NET Web サイトがあり、特に 1 つのページでユーザーがデータを更新できます。このページには、GridView の Sqldatasource オブジェクトと、GridView の編集モードの各ドロップダウン リストがあります。このページは、1 つのフィールドをオープン テキストからドロップダウンに変更するまではうまく機能します。ドロップダウン内のアイテムは、別の列の選択されたアイテムに依存します。レコードごとに「サイト」と「部屋」の列があり、選択したサイトに基づいて部屋のドロップダウンリストが変わります。また、新しい/null レコードをサポートするために、ドロップダウン リストの上部に空白の項目を追加する必要があります。null レコードをサポートするために、room 列のドロップダウン リストを AppendDataBoundItems = true に変更して、空の項目を追加できるようにしました。その後、sqldatasource から取得した項目が読み込まれます。この実装の問題点は、サイトのドロップダウン リストが変更されるたびに (そしてポストバックされて)、部屋番号の新しいリストが部屋のドロップダウン リストに追加されることです。これは望ましくありません。サイト欄。この問題を解決するために、次のコードを追加しました。
protected void DropDownListSite_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList drop = (DropDownList)GridView1.Rows[GridView1.EditIndex].FindControl("DropDownListSite");
Session["atSite"] = drop.SelectedItem.Text;
DropDownList roomdrop = (DropDownList)GridView1.Rows[GridView1.EditIndex].FindControl("DropDownListRoom");
roomdrop.Items.Clear();
roomdrop.Items.Add(string.Empty);
}
さらに、ルーム ドロップダウンリストの値がデータバインドされている場合、サイト列を変更すると例外が発生します。
Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.
Stack Trace:
[InvalidOperationException: Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.]
System.Web.UI.Page.GetDataItem() +2642054
ASP.viewassets_aspx.__DataBinding__control28(Object sender, EventArgs e) in <redacted path>\Temporary ASP.NET Files\root\81f582e0\4392b2e5\App_Web_kyt9rnda.0.cs:0
System.Web.UI.Control.OnDataBinding(EventArgs e) +99
System.Web.UI.WebControls.ListControl.OnDataBinding(EventArgs e) +14
System.Web.UI.WebControls.ListControl.PerformSelect() +34
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +73
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82
System.Web.UI.WebControls.BaseDataBoundControl.OnPreRender(EventArgs e) +22
System.Web.UI.WebControls.ListControl.OnPreRender(EventArgs e) +18
System.Web.UI.Control.PreRenderRecursiveInternal() +80
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +842
これは、ルームのドロップダウン リストで選択した値がリストの項目ではなくなったため、メイン ページのスレッドがクラッシュしたことを意味すると思います。
グリッドビューのコードは次のとおりです。
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
CellPadding="3" DataSourceID="SqlDataSource1" ForeColor="#333333"
HorizontalAlign="Center" onrowcreated="GridView1_RowCreated"
AllowSorting="True"
onselectedindexchanged="GridView1_SelectedIndexChanged"
style="text-align: center" onprerender="GridView1_PreRender"
onrowdatabound="GridView1_RowDataBound" DataKeyNames="name"
EnableModelValidation="True" onrowupdated="GridView1_RowUpdated"
onrowediting="GridView1_RowEditing" AllowPaging="True">
<RowStyle BackColor="#EFF3FB" />
<Columns>
<asp:CommandField SelectText="Pop->" ShowEditButton="True" Visible="False" >
<ItemStyle ForeColor="Blue" />
</asp:CommandField>
<asp:BoundField DataField="name" HeaderText="name" SortExpression="name"
ReadOnly="True" />
<asp:BoundField DataField="model" HeaderText="model" SortExpression="model"
ReadOnly="True" Visible="False" />
<asp:BoundField DataField="Age" HeaderText="Age" ReadOnly="True"
SortExpression="Age" Visible="False" />
<asp:BoundField DataField="Last Check-in" HeaderText="Last Check-in"
SortExpression="Last Check-in" ReadOnly="True" Visible="False" />
<asp:BoundField DataField="ip" HeaderText="ip" SortExpression="ip"
ReadOnly="True" Visible="False" />
<asp:TemplateField HeaderText="site" SortExpression="site">
<EditItemTemplate>
<asp:Panel ID="Panel1" runat="server">
<asp:DropDownList ID="DropDownListSite" runat="server" AppendDataBoundItems="True"
DataSourceID="SqlDataSourceSiteEdit" DataTextField="school"
DataValueField="school" SelectedValue='<%# Bind("Site") %>'
AutoPostBack="True"
onselectedindexchanged="DropDownListSite_SelectedIndexChanged">
<asp:ListItem></asp:ListItem>
</asp:DropDownList>
<br />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" CssClass="EditValidator"
ErrorMessage="Required field" ControlToValidate="DropDownListSite"></asp:RequiredFieldValidator>
</asp:Panel>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("site") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="room" SortExpression="room">
<EditItemTemplate>
<asp:DropDownList ID="DropDownListRoom" runat="server"
DataSourceID="SqlDataSourceRooms" DataTextField="roomName"
DataValueField="roomName" SelectedValue='<%# Bind("room") %>'
onselectedindexchanged="DropDownListRoom_SelectedIndexChanged"
AppendDataBoundItems="True" ondatabound="DropDownListRoom_DataBound"
onprerender="DropDownListRoom_PreRender">
<asp:ListItem></asp:ListItem>
</asp:DropDownList>
<br />
<asp:RequiredFieldValidator ID="RequiredFieldValidator6" runat="server"
ControlToValidate="DropDownListRoom" CssClass="EditValidator"
ErrorMessage="Required field"></asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label6" runat="server" Text='<%# Bind("room") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Function" SortExpression="Function">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList3" runat="server"
SelectedValue='<%# Bind("Function") %>'>
<asp:ListItem></asp:ListItem>
<asp:ListItem>Desktop</asp:ListItem>
<asp:ListItem>Laptop</asp:ListItem>
</asp:DropDownList>
<br />
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server"
ControlToValidate="DropDownList3" CssClass="EditValidator"
ErrorMessage="Required"></asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("Function") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Local Printer"
SortExpression="Local Printer Type">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList4" runat="server"
SelectedValue='<%# Bind("[Local Printer Type]") %>'>
<asp:ListItem></asp:ListItem>
<asp:ListItem>None</asp:ListItem>
<asp:ListItem>InkJet</asp:ListItem>
<asp:ListItem>Laser</asp:ListItem>
<asp:ListItem>Impact</asp:ListItem>
</asp:DropDownList>
<br />
<asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server"
ControlToValidate="DropDownList4" CssClass="EditValidator"
ErrorMessage="Required"></asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server"
Text='<%# Bind("[Local Printer Type]") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Location Type" SortExpression="Location Type">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList5" runat="server"
SelectedValue='<%# Bind("[Location Type]") %>'>
<asp:ListItem></asp:ListItem>
<asp:ListItem>Classroom</asp:ListItem>
<asp:ListItem>Office</asp:ListItem>
<asp:ListItem>Media Center</asp:ListItem>
<asp:ListItem>Mobile Lab</asp:ListItem>
<asp:ListItem>Fixed Lab</asp:ListItem>
</asp:DropDownList>
<br />
<asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server"
ControlToValidate="DropDownList5" CssClass="EditValidator"
ErrorMessage="Required"></asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("[Location Type]") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Primary Use" SortExpression="Primary Use">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList6" runat="server"
SelectedValue='<%# Bind("[Primary Use]") %>'>
<asp:ListItem></asp:ListItem>
<asp:ListItem>Admin</asp:ListItem>
<asp:ListItem>Student</asp:ListItem>
<asp:ListItem>Teacher</asp:ListItem>
</asp:DropDownList>
<br />
<asp:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server"
ControlToValidate="DropDownList6" CssClass="EditValidator"
ErrorMessage="Required"></asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label5" runat="server" Text='<%# Bind("[Primary Use]") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Comments" SortExpression="Comments">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Comments") %>'></asp:TextBox>
<br />
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label7" runat="server" Text='<%# Bind("Comments") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Last Updated" HeaderText="Last Updated"
SortExpression="Last Updated" ReadOnly="True" />
<asp:BoundField DataField="FA_Number" HeaderText="FA_Number"
SortExpression="FA_Number" ReadOnly="True" />
<asp:BoundField DataField="Funding_Source" HeaderText="Funding_Source"
SortExpression="Funding_Source" ReadOnly="True" />
</Columns>
</asp:GridView>
だから私の質問は次のとおりです:選択したサイトに基づいて部屋の列が動的であるデータソースをデータバインドするにはどうすればよいですか?サイトの列が変更され、選択された値がなくなったときに、リスト内の空白(インデックス0)のアイテムにデフォルト設定されますリストのアイテム?
これが長くなってしまったり、何か重要なことを省略したりした場合は、事前にお詫び申し上げます。明確にするためにお気軽に質問してください。
前もって感謝します :)