web-dev-qa-db-ja.com

DropDownList AppendDataBoundItems(最初の項目が空白で重複がないこと)

DropDownListからのポストバックで生成されるUpdatePanel内にSqlDataSourceがあります。別のコントロールであるパラメーターがあります。複数のポストバックが必要になる場合がありますが、更新パネルが更新されるたびに、アイテムがDropDownListに追加されます。そのため、DropDownListには、誤ったデータまたは繰り返しデータが含まれることになります。

最初の項目を空白にする必要があるため、AppendDataBoundItemsプロパティをtrueに設定しています。

どうすればこの問題を克服できますか?最初のアイテムを空白にする別の方法はありますか?

(このDropDownListはASP.NET 2.0 Webアプリにあり、分離コードはC#にあります)

35
zohair

AppendDataboundItems='true'(問題の原因になります)を使用する代わりに、DataBoundDropDownListイベントに応答し、「空白」アイテムをリスト。

<asp:DropDownList runat="server" ID="MyList"
  ondatabound="MyListDataBound"></asp:DropDownList>

次に、コードビハインドで:

protected void MyListDataBound(object sender, EventArgs e)
{
    MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
62
Keltex

ここには良い答えがありますが、機能するオプションが複数あり、どちらを使用するかを決定する必要があるため、より多くの情報を含める必要があると感じました。

まず、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で定義できません。
  • DataBindPage_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 -", ""));
}
5
Tony L.

おそらく、コードビハインドでそのDropDownListをバインドします。したがって、ポストバック後に再度実行しないでください。

// probably in Page_Load method
if (!Page.IsPostBack)
{
    // do data binding here
};
4
gius

ここにアイデアがあります。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();
}
3
Terminator

これがアイデアです。

ドロップダウンリストにAutoPostBackというプロパティがあり、それをtrueに設定してから、ビハインドコードですべてのバインディングメソッドをif(!Page.IsPostBack)内に配置します。それは私のために働いた。

よろしく。

0
Miguel

コードは機能します。値を指定してください。

MyList.Items.Insert(0, new ListItem("- Select -", "0"));
0
Salmiakk

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>
0
Mahmoud Nashaat
<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>
0
bagher