DropDownList
からのポストバックで生成されるUpdatePanel
内にSqlDataSource
があります。別のコントロールであるパラメーターがあります。複数のポストバックが必要になる場合がありますが、更新パネルが更新されるたびに、アイテムがDropDownList
に追加されます。そのため、DropDownList
には、誤ったデータまたは繰り返しデータが含まれることになります。
最初の項目を空白にする必要があるため、AppendDataBoundItems
プロパティをtrue
に設定しています。
どうすればこの問題を克服できますか?最初のアイテムを空白にする別の方法はありますか?
(このDropDownList
はASP.NET 2.0 Webアプリにあり、分離コードはC#にあります)
AppendDataboundItems='true'
(問題の原因になります)を使用する代わりに、DataBound
のDropDownList
イベントに応答し、「空白」アイテムをリスト。
<asp:DropDownList runat="server" ID="MyList"
ondatabound="MyListDataBound"></asp:DropDownList>
次に、コードビハインドで:
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
ここには良い答えがありますが、機能するオプションが複数あり、どちらを使用するかを決定する必要があるため、より多くの情報を含める必要があると感じました。
まず、AppendDataBoundItems
を理解する必要があります。 AppendDataBoundItems = "true"
、ListItems
は、古いものをクリアせずにDropDownList
に追加されます。それ以外の場合、DropDownList
は次のDataBind
の前にクリアされます。 MSDN AppendDataBoundItems doc
基本的に答えのほとんどがカバーする2つのオプションがあります。
1。 htmlで空白のオプションを定義し、データベースからListItemをDropDownListに1回だけ追加します。
ここで3つのことに注意してください。
ListItem
がhtmlで定義されていますAppendDataBoundItems="true"
DataBind
は、ポストバック時またはDropDownList
アイテムカウントが1より大きい場合は呼び出されませんソース:
<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" >
<asp:ListItem Text="- Select One -" Value="" />
</asp:DropDownList>
コードビハインド:
protected void Page_Load(object sender, System.EventArgs e)
{
if (MyList.Items.Count <= 1 ) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
注:カウントをチェックするロジックとIsPostBack
をチェックするロジックが好きです。多くの場合、PostBacksは重複データバインディングの原因ですが、他の方法でそれを引き起こすことも可能です。アイテムカウントの確認は、基本的に、既に読み込まれているかどうかを確認するだけです。
または(代わりにIsPostBack
を使用するオプション)
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
2。ページを更新するたびにDropDownListをクリアしてリロードします。
最初のオプションとの3つの違いに注意してください。
AppendDataBoundItems="false"
(定義されていない場合、false
がデフォルト値です)ListItem
がコードビハインドに追加されます。 AppendDataBoundItems="false"
を使用するとクリアされるため、htmlで定義できません。DataBind
はPage_Load
ごとに呼び出されますソース:
<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name"
OnDataBound="MyList_DataBound" >
</asp:DropDownList>
コードビハインド:
protected void Page_Load(object sender, System.EventArgs e)
{
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
protected void MyList_DataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select One -", ""));
}
おそらく、コードビハインドでそのDropDownListをバインドします。したがって、ポストバック後に再度実行しないでください。
// probably in Page_Load method
if (!Page.IsPostBack)
{
// do data binding here
};
ここにアイデアがあります。2つのイベントを使用できます:DataBoundおよびDataBinding:
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
protected void MyListDataBinding(object sender, EventArgs e)
{
MyList.Items.Items.Clear();
}
これがアイデアです。
ドロップダウンリストにAutoPostBack
というプロパティがあり、それをtrueに設定してから、ビハインドコードですべてのバインディングメソッドをif(!Page.IsPostBack)
内に配置します。それは私のために働いた。
よろしく。
コードは機能します。値を指定してください。
MyList.Items.Insert(0, new ListItem("- Select -", "0"));
EnableViewState = "false"をDropdownタグに追加するだけです
<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource"
DataTextField="Name" DataValueField="ID" EnableViewState="false"
AppendDataBoundItems="true">
<asp:ListItem Value="">Select</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="DropDownList1" AppendDataBoundItems="true" runat="server"
DataSourceID="SqlDataSource1" DataTextField="state" DataValueField="state">
<asp:ListItem Text="(Select a State)" Value="" />
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>"
SelectCommand="SELECT DISTINCT [state] FROM [authors]">
</asp:SqlDataSource>