0

EditItemTemplate に adrpDownList を含む GridView があります。元のデータはラベルにあり、編集モードでは ddl に転送されます。編集ボタンを押すと、例外が発生しました: System.ArgumentOutOfRangeException: 'ddlCities' には、アイテムのリストに存在しないため、無効な SelectedValue があります。ここで同様の質問を見つけ、次のようにコードを自分のニーズに合わせて調整しました (ここで、city は gridView の itemTemplate のラベルから受け取った文字列です)。

 protected void gvClients_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (!string.IsNullOrEmpty(city))
        {
            ddlTemp = (DropDownList)e.Row.Cells[7].FindControl("ddlCities");
            if (ddlTemp != null)
            {

                ListItem item = ddlTemp.Items.FindByValue(city);
                if (item != null)
                {
                    item.Selected = true;

                }
            }
        }
    }

それを機能させるために、 SelectedValue = <%# Bind("City") %> を消去する必要がありました。そうしないと、上記の例外が再び発生しました。しかし、ddl で選択された値に従ってデータを更新したいのですが、ddl が gridView データ ソースの何にもバインドされていないため、更新できません。助けていただければ幸いです。

4

2 に答える 2

1

値を設定する前に、ドロップダウンをバインドしていることを確認してください。

Control ddlCtrl = e.Row.FindControl("ddlCities");
if (ddlCtrl != null)
{
    DropDownList ddlCities = ddlCtrl as DropDownList;

    //using a datasource control
    CitiesDataSourceControl.DataBind();

    if (ddlCities.Items.Count > 0) 
    {
        ListItem item = ddlCities.Items.FindByValue("Boston");
        if (item != null)
            item.Selected = true;
    }
}
于 2011-08-25T14:09:30.663 に答える
0

どうやら問題は、私の都市データが右から左の言語 (ヘブライ語) であるため、ItemTemplate ラベルがデータにバインドされると先頭にスペースが追加されるため、それを ddl SelectedValue にバインドすると、ddl 項目で項目が見つからないことです。リスト。これは、RowEditing イベントをキャッチすることで解決し、Trim() 関数を使用してラベルからテキストを抽出し、トリミングされた値を city という文字列変数に入れました。次に、RowDataBound イベント (問題のコード) で、ddl 内の適切な項目を選択することに成功しました。ddl は GridView のデータにバインドされていないため、city 列を更新できませんでした。そのために、ddl の SelectedIndexChanged イベントをキャッチし、選択した値を ViewState["CitySelect"] という ViewState オブジェクトに入れました。

 protected void gvClients_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {

        GridViewRow row = gvClients.Rows[e.RowIndex];

        if (ViewState["CitySelect"] != null)
        {
            e.NewValues.Remove("city");
            string tempCity = (string)ViewState["CitySelect"];
            e.NewValues.Add("city",tempCity);
            row.Cells[7].Text = (string)e.NewValues["city"];
        }
        else
            row.Cells[7].Text = (string)e.OldValues["city"];
    }

誰かがもっと簡単なものを提案できるなら、私はそれを感謝します。

于 2011-08-30T11:41:12.640 に答える