0

我在 EditItemTemplate 中有一个带有 adrpDownList 的 GridView。原始数据在标签中,在编辑模式下被传输到 ddl。按下编辑按钮时,我收到了一个异常: System.ArgumentOutOfRangeException: 'ddlCities' has a 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 Label 绑定到数据时,它会添加前导空格,因此当将其绑定到 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 回答