Как я могу получить выбранное значение от DropDownlist в режиме редактирования GRIDVIEW?
-
12-11-2019 - |
Вопрос
В моем приложении, когда я редактирую строку в 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
}
.
У кого-нибудь есть идеи?
Я пробовал много способов установить выбранное значение в событии «ROWDATATABOUND», но без удачи.Я попробовал это:
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>
. Решение
ВыбранныйIndex всегда будет по умолчанию до 0, если не определите его в вашем определении DropDownlist.
Редактировать: @tim schmelter должен добавить свой комментарий как Anwer.Тем временем я перефразирую для других читателей: вам нужно проверить поступлений (см. Комментарии выше).
Другие советы
Вы можете объявить генеракодицетагкод И вы можете объявить событие
private void onSeletedIndexChange(object sender,EventArgs e)
{
mainBX = (ComboBox)(sender);
}
.
и Далее вы должны соблюдать Foreach Combobox в GridView и добавить это событие. Чем все, что вы должны сделать, есть, возьмите Mainbx.seledItem ();
Я думаю, что это то, что вам нужно, если не извиняться.
Чтобы установить выбранное значение в событии 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 и устанавливает 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();
}
. У меня была такая же проблема с другим решением, я реализовал пользовательский пейджинг на 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();
}
.