エラー:SelectedValueは無効でに存在しない品目の一覧
-
19-09-2019 - |
質問
いGridviewを結合する、ObjectDataSource(objStudentDetails).編集/挿入モードのGridviewの分野ではDropDownListることがで選択リストオプションからルックアップ。私はこのDropDownList結合する他のObjectDataSource制御(objStateList)のルックアップ。しての価値のobjStudentDetails ObjectDataSource一致する値をobjStateList ObjectDataSource、少なくとも、場合には、空の文字列値。
のobjStateListは、これらの値に格納され,その荷重で-ID#6は空の文字列):
StateId State
----------- -----
6
4 AL
1 GA
3 KY
2 TN
のobjStudentDetailsは、これらの値に格納され,その荷重れます。
FirstName LastName State
----------- ---------- -----
tone smith TN
またはになりますので注意してくださいこの結果セット(状態が空の文字列"):
FirstName LastName State
----------- ---------- -----
jenny johnson
第objStudentDetails resultsetの状態DropDownListのEditItemTemplate表示されます。第二resultsetしており、このエラー:
'ddlEditState' has a SelectedValue which is invalid because it does not exist in the list of items.
Parameter name: value
ってると思いることからルックアップテーブルの値が空文字列のobjStudentDetails値が空の文字列の状態にマッチしがっていないに期待したいということです。
こちらは自EditItemTemplateコードからのGridview:
<EditItemTemplate>
<asp:Panel ID="panEditState" runat="server">
<asp:DropDownList ID="ddlEditState" runat="server" CssClass="GridviewDropdownlist"
DataSourceID="objStateList" DataTextField="State" DataValueField="State"
SelectedValue='<%# Bind("State") %>'
Width="50px">
</asp:DropDownList>
</asp:Panel>
</EditItemTemplate>
のobjStateListる方法でパラメータを渡するルックアップテーブルク
<asp:ObjectDataSource ID="objStateList" runat="server" SelectMethod="GetDropdownData" TypeName="AIMLibrary.BLL.DropdownData">
<SelectParameters>
<asp:Parameter Name="itemsToGet" DefaultValue="state" />
</SelectParameters>
</asp:ObjectDataSource>
そのアイデア?
解決
trueに両方DropDownLists' AppendDataBoundItemsプロパティを設定することで起動します。宣言型マークアップがどのように見えるように、次に、各DropDownListコントロールに次の<asp:ListItem>
要素を追加することにより、NULLのListItemを追加します:
<asp:DropDownList ID="Categories" runat="server"
DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>'
AppendDataBoundItems="True">
<asp:ListItem Value="">[nothing selected]</asp:ListItem>
</asp:DropDownList>
他のヒント
私はこのエラーを引き起こす可能性があり、多くの異なるシナリオがあると思います。私の場合、私がダウンしたテンプレートフィールドに置か低下していました。ドロップダウンは、独自のObjectDataSourceにバインドし、そのSelectedValueのプロパティは、GridViewの独自の(別の)データソースからフィールドにバインドされました。
さて、私の特定のシナリオで、この問題は競合状態でした。 GridViewのデータソースは、人口とドロップダウンが自分のターンを持っていた前に拘束されていました。これはまた、アイテム、独自のバインディングを介して作成されたドロップダウンドロップダウン前selectedvaluesが設定されていたがあることを意味します。
私はよりよい解決策があるように持っていると確信しているが、私は研究のために多くの時間を持っていませんでした。私は(デザイナーから割り当てを削除する、という意味)と、プログラムのバインドを選んだのGridViewし、そのデータソースからドロップダウンを切断しました。 GridViewの自体がバインドされたときにその項目の値が利用可能になるように、その方法は、私が明示的にドロップダウンをバインドすることができます。
これまでのところ、とても良いです。 Page_Loadのコードのちょうど少数の余分なライン
AppendDataBoundItems =「真の」>は、すべてのケースで動作しますが、ありません。 GridViewコントロール内のドロップダウンリスト作ることはまだMicrosoftが解決しなければならない謎です。彼らは、開発がASPはPHPよりもはるかに高速であると言います。まあこれは私の三日目は、このの小さなの問題であり、まだ解決策を持っていません。
OK、この共通の問題かもその価値を実際にポストの答え:後に多くの見かたソリューションや、パッチと導きます。
パッチング:セットのDDL設定
AppendDataBoundItem=true
アンダの追加を手動で一つの要素のリスト("を選択してください"null値):< asp:DropDownList ID="DropDownList5runat="サーバ"AppendDataBoundItems="True"...> < asp:ListItem>を選択してください<aspインダストリ:ListItem> < aspインダストリ:DropDownList>
この仕事は約80%である。また変な状況があったかアップ、既存の作)クエリを使用DDLを別の値のパラメータ問合せにしたようなもの SELECT ID, Name from EMPLOYEES where Department =@Department
とともに、 @Department
できる等価"になプランナー"と"ワークショップ"-を追加した後に、"物流"DDL神秘的に止まりのみのための新しい値。
- 適切な解決:BindのDDLの
GridView_RowDataBound
イベント(源泉はん この記事
私のパラメータはテキストからのラベルを設定else)
protected void GridView5_RowDataBound(object sender, GridViewRowEventArgs e)
{
//********** this is a workaround for the annoying problem with dropdownlist in gidview without adding new item ************
if (e.Row.RowType == DataControlRowType.DataRow && GridView5.EditIndex == e.Row.RowIndex)
{
DropDownList DropDownList5 = (DropDownList)e.Row.FindControl("DropDownList5");
string query = "SELECT gkey as empID, name FROM [employees] where department=@department";
SqlCommand command = new SqlCommand(query);
command.Parameters.AddWithValue("@department", lblDepartment.Text);
DropDownList5.DataSource = GetData(command);
DropDownList5.DataTextField = "name";
DropDownList5.DataValueField = "empID";
DropDownList5.DataBind();
}
のGetData方法
private DataTable GetData (SqlCommand cmd)
{
string strConnString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection con = new SqlConnection(strConnString))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataTable dt= new DataTable())
{
sda.Fill(dt);
return dt;
}
}
}
}