5

ObjectDataSource(objStudentDetails)にバインドするGridviewがあります。Gridviewの編集/挿入モードでは、フィールドの1つはDropDownListであり、ルックアップテーブルから選択リストオプションを取得します。このDropDownListは、ルックアップテーブルを表す別のObjectDataSourceコントロール(objStateList)にバインドされています。objStudentDetails ObjectDataSourceの値がobjStateListObjectDataSourceの値の1つと一致する限り、少なくとも空でない文字列値の場合は、正常に機能します。

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結果セットでは、EditItemTemplateの状態DropDownListが正常に表示されます。ただし、2番目の結果セットでは、次のエラーが発生します。

'ddlEditState' has a SelectedValue which is invalid because it does not exist in the list of items.
Parameter name: value 

私のルックアップテーブルには空の文字列を持つ値があるので、状態の空の文字列を持つobjStudentDetails値は一致すると思いますが、何かが期待どおりに機能していません。

これがGridviewからの私のEditItemTemplateコードです:

<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>

何か案は?

4

4 に答える 4

9

まず、DropDownListsのAppendDataBoundItemsプロパティを両方ともtrueに設定します。<asp:ListItem>次に、宣言型マークアップが次のようになるように、各DropDownListに次の要素を追加してNULLListItemを追加します。

<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>
于 2009-12-09T19:56:10.140 に答える
1

このエラーを引き起こす可能性のあるさまざまなシナリオがあると思います。私の場合、テンプレートフィールドにドロップダウンを配置しました。ドロップダウンはそれ自体のobjectdatasourceにバインドされ、そのselectedvalueプロパティはグリッドビュー自体の(個別の)データソースからのフィールドにバインドされました。

さて、私の特定のシナリオでは、問題は競合状態でした。ドロップダウンが順番になる前に、gridviewのデータソースにデータが入力されてバインドされていました。これは、ドロップダウンのアイテムが独自のバインディングを介して作成される前に、ドロップダウンの選択された値が設定されていたことも意味します。

もっと良い解決策があるはずですが、研究する時間があまりありませんでした。グリッドビューとドロップダウンをデータソースから切断し(つまり、デザイナーから割り当てを削除し)、プログラムでバインドを選択しました。そうすれば、ドロップダウンを明示的にバインドして、グリッドビュー自体がバインドされたときにアイテムの値を使用できるようにすることができます。

ここまでは順調ですね。Page_Loadに数行追加するだけです

于 2012-01-10T20:06:45.860 に答える
0

AppendDataBoundItems = "True">は機能しますが、すべての場合に機能するわけではありません。GridView内にドロップダウンリストを作成することは、Microsoftが解決しなければならない謎です。彼らは、ASPはPHPよりもはるかに高速であると言っています。さて、これはこの小さな問題についての私の3日目であり、まだ解決策がありません。

于 2011-07-05T18:47:58.517 に答える
0

OK、これは一般的な問題なので、実際に回答を投稿する価値があると思います。よく調べてみると、2つの解決策が見つかりました。1つはパッチ、もう1つは実際の解決策です。

  1. パッチ適用:DDL設定を設定AppendDataBoundItem=trueし、リストに1つの要素を手動で追加します(つまり、null値で「選択してください」)。

    <asp:DropDownList ID = "DropDownList5 runat =" server "AppendDataBoundItems =" True "...> <asp:ListItem>選択してください</ asp:ListItem> </ asp:DropDownList>

これは、約80%のケースで機能するようです。DDLで使用されている既存の(そして機能している)クエリをアップグレードして、パラメータの別の値を許可する必要があるとき、奇妙な状況になりました-クエリは「ロジスティクス」を追加した後、「プランナー」と「ワークショップ」に似ていてSELECT ID, Name from EMPLOYEES where Department =@Department、元々@Departmentは「ワークショップ」としか等しくありませんでした「DDLは不思議なことに、部門の新しい価値のためだけに機能を停止しました。

  1. 適切な解決策:イベント中にDDLをバインドします(この記事GridView_RowDataBoundに感謝します

私のパラメータはラベルからテキストとして取得されます(別の場所に設定されています)

    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;
            }
        }
    }
}
于 2014-11-13T19:13:21.253 に答える