Как я могу получить выбранное значение из выпадающего списка в режиме редактирования вида сетки? - PullRequest
5 голосов
/ 12 мая 2011

В моем приложении, когда я редактирую строку в виде сетки, я выбираю некоторые новые данные из выпадающего списка.

Я заполняю раскрывающийся список следующим образом:

 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:

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

1 голос
/ 12 мая 2011

SelectedIndex всегда будет по умолчанию равным 0, если вы не определите его в своем определении DropDownList.

Редактировать: @Tim Schmelter должен добавить свой комментарий в качестве ответа.А пока я перефразирую других читателей: вам нужно проверить обратную передачу (см. Комментарии выше).

0 голосов
/ 14 августа 2013

У меня была та же проблема с другим решением, я реализовал пользовательский пейджинг в 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();
}
0 голосов
/ 13 мая 2011

Чтобы установить Выбранное значение в RowDataBound -Event, вы должны сделать это следующим образом:

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

FindByValue находит текущее 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();
    }
0 голосов
/ 12 мая 2011

Вы можете объявить ComboBox mainBX = new Combobox(); и вы можете объявить событие

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

и далее вы должны выполнить итерацию foreach ComboBox в GridView и добавить это событие. Все, что вам нужно сделать, это взять mainBX.seletedItem ();

Я думаю, что это то, что вам нужно, если не извиниться.

...