如何在gridview的编辑模式下从下拉列表中获取所选值?

时间:2011-05-12 13:51:59

标签: c# asp.net gridview drop-down-menu editmode

在我的应用程序中,当我在gridview中编辑一行时,我从下拉列表中选择一些新数据。

我正在填写下拉列表:

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if ((e.Row.RowState & DataControlRowState.Edit) > 0)
            {
                DropDownList emailsListDL = (DropDownList)e.Row.FindControl("emailsDL");
                emailsListDL.DataSource = allUsersEmails;//list of strings with the emails of the users
                emailsListDL.DataBind();
            }
        }
    }

但是,当我按下模板中的“更新”按钮并进入“RowUpdating”事件时,每次下拉列表中的第一个值时,下拉列表中的选定值就会显示。

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        DropDownList emailsListDL = (DropDownList)GridViewAdvertisers.Rows[e.RowIndex].FindControl("emailsDL");
        string email = emailsListDL.SelectedValue; //the selected value is every time the first value from the dropdownlist
    }

有没有人有任何想法?

我已尝试过多种方法在'RowDataBound'事件中设置所选值,但没有运气。我试过这个:

1. emailsListDL.SelectedIndex = emailsListDL.Items.IndexOf(emailsListDL.Items.FindByValue(DataBinder.Eval(e.Row.DataItem, "OwnerMail").ToString()));
2. emailsListDL.SelectedValue = GridViewAdvertisers.DataKeys[e.Row.RowIndex]["OwnerMail"].ToString();
3. emailsListDL.SelectedValue = GridViewAdvertisers.Rows[e.Row.RowIndex].Cells[1].Text;
//ownerMail is a string (object) from the list of objects that I put as datasource to the gridview

谢谢, 杰夫

更新

aspx页面中的My Item模板是:

 <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle"
                ItemStyle-Width="150px" HeaderText="Owner Email" HeaderStyle-HorizontalAlign="Left"
                HeaderStyle-BorderWidth="1px" HeaderStyle-BorderColor="#e1e1e1">
                <ItemTemplate>
                    <asp:Label ID="LabelEmail" runat="server" Text='<%# Bind("OwnerMail")%>'></asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="emailsDL" runat="server" Width="150">
                    </asp:DropDownList>
                </EditItemTemplate>
                <HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" Font-Bold="True"></HeaderStyle>
                <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="180px" BorderWidth="1px"
                    BorderColor="#e1e1e1"></ItemStyle>
    </asp:TemplateField>

4 个答案:

答案 0 :(得分:1)

如果您没有在DropDownList定义中定义SelectedIndex,它将始终默认为0.

编辑:@Tim Schmelter应该将他的评论添加为anwer。与此同时,我会为其他读者解释:你需要检查回发(见上面的评论)。

答案 1 :(得分:0)

您可以声明ComboBox mainBX = new Combobox(); 你可以宣布一个事件

private void onSeletedIndexChange(object sender,EventArgs e)
{
        mainBX = (ComboBox)(sender);
}

接下来你应该在GridView中迭代foreach ComboBox并添加此事件。 比你应该做的更多的是,采取mainBX.seletedItem();

我认为这就是你所需要的,如果不道歉的话。

答案 2 :(得分:0)

要在RowDataBound - 事件中设置选定值,您应该这样做:

(DropDownList)e.Row.Cells[/*index*/].Controls[/*index, or use FindControl*/]).Items.FindByValue(((DataRowView)e.Row.DataItem).Row.ItemArray[/*columnnumber*/].ToString()).Selected = true;

FindByValue在“普通”Viewmode中查找Field的当前Textvalue,并使用值设置DropDownList。

当然这需要封装在

if ((e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit)
{
}

至于你的“获得更新的价值” - 问题,我必须诚实地说我没有线索,因为你的方法与我的方法完全一样,唯一不同的是:我的工作。

如果有任何帮助,这是我的代码:

 protected void gridVariables_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {

        string control = ((DropDownList)gridVariables.Rows[e.RowIndex].Cells[3].Controls[1]).SelectedValue;
        gridVariables.EditIndex = -1;
        this.gridVariables_DataBind(control, e.RowIndex);
    }

private void gridVariables_DataBind(string control, int index)
    {
        DataTable dt = (DataTable)Session["variableTable"]; //features a DataTable with the Contents of the Gridview
        dt.Rows[index]["ControlType"] = control;
        gridVariables.DataSource = dt;
        gridVariables.DataBind();
    }

答案 3 :(得分:0)

我在使用不同的解决方案时遇到了同样的问题,我在GridView上使用自定义分页器实现了自定义分页,并在此过程中添加了RowCommand方法,该方法使用新的页面索引重新绑定网格。虽然在更新期间也调用了RowCommand方法,但仍然会发生这种情况。

所以请确保检查任何其他位置您可能在代码中的任何位置绑定。 希望这有助于其他人。

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    string commandName = e.CommandName;

    switch (commandName)
        {
            case "Page1":
                HandlePageCommand(e);
                //binding should happen here
                break;
        }

        //this line is in the wrong location, causing the bug    
        BindGrid1();
}