如何在网格视图的编辑模式下从下拉列表中获取所选值
本文关键字:下拉列表 获取 模式 网格 视图 编辑 | 更新日期: 2023-09-27 17:56:08
在我的应用程序中,当我在网格视图中编辑一行时,我会从下拉列表中选择一些新数据。
我像这样填充下拉列表:
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>
如果未在 DropDownList 定义中定义 SelectedIndex 将始终默认为 0。
编辑:@Tim施梅尔特应该添加他的评论作为安维尔。 同时,我将为其他读者解释:您需要检查回发(请参阅上面的评论)。
你可以声明一个ComboBox mainBX = new Combobox();
您可以声明一个事件
private void onSeletedIndexChange(object sender,EventArgs e)
{
mainBX = (ComboBox)(sender);
}
接下来,您应该在 GridView 中迭代每个组合框并添加此事件。比你应该做的是,采取主BX.seletedItem();
我认为这就是你需要的,如果不道歉。
要在 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 在"正常"视图模式下查找字段的当前文本值,并使用该值设置 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){ 字符串命令名称 = e.命令名称; 开关(命令名称) { 案例"第 1 页": HandlePageCommand(e); 绑定应该在这里发生 破; } 此行位于错误的位置,导致错误 绑定网格1();}