Gridview EditItemTemplate DropDownList Get SelectedValue
В моем Gridview у меня есть следующее поле шаблона:
<asp:TemplateField HeaderText="Dept Code" SortExpression="DeptCode">
<ItemTemplate>
<%# Eval("DeptCode") %>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="ddlDeptCode" runat="server"
SelectedValue='<%# Eval("DeptCode") %>'
DataSource='<%# GetAllDepartments() %>'
DataTextField="DeptCode"
DataValueField="DeptCode" />
</EditItemTemplate>
</asp:TemplateField>
Это прекрасно работает, когда я нажимаю Edit в строке, он заполняет DropDownList всеми значениями и выбирает правильное значение для этой строки.
Тем не менее, когда я пытаюсь обновить строку: OnRowUpdating="UpdateRow"
protected void UpdateRow(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = UserGV.Rows[e.RowIndex];
DropDownList ddl = row.FindControl("ddlDeptCode") as DropDownList;
string deptCode = ddl.SelectedValue;
}
Он находит элемент управления DropDownList, но SelectedValue всегда является пустой строкой.
Мне нужен доступ к выбранному значению, чтобы сохранить в базе данных.
Любые идеи относительно того, как я могу получить SelectedValue DropDownList в Gridview в коде позади?
Редактировать:
Вы также можете заполнить DropDownList и SelectedValue из кода:
protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if ((e.Row.RowState & DataControlRowState.Edit) > 0)
{
var deptMgr = new DepartmentMgr();
List<Department> departments = deptMgr.GetAllDepartments();
DropDownList ddList = (DropDownList)e.Row.FindControl("ddlDeptCode");
ddList.DataSource = departments;
ddList.DataTextField = "DeptCode";
ddList.DataValueField = "DeptCode";
ddList.DataBind();
string userDeptCode = DataBinder.Eval(e.Row.DataItem, "DeptCode").ToString();
ddList.SelectedItem.Text = userDeptCode;
ddList.SelectedValue = userDeptCode;
}
}
}
2 ответа
Я использовал немного хака, чтобы получить второй заголовок для заголовка таблицы при привязке вида сетки:
GridViewRow row = new GridViewRow(0, -1, DataControlRowType.Header, DataControlRowState.Normal);
TableCell th = new TableHeaderCell();
th.HorizontalAlign = HorizontalAlign.Center;
th.ColumnSpan = UserGV.Columns.Count;
th.BackColor = Color.SteelBlue;
th.ForeColor = Color.White;
th.Font.Bold = true;
th.Text = "Manage Users";
row.Cells.Add(th);
InnerTable.Rows.AddAt(0, row);
Я не совсем понимаю, как это мешало получению SelectedValue элемента управления DropDownList, но как только я это прокомментировал, он начал работать.
Для тех, кто заинтересован, я получил второй заголовок, работающий с этим, используя другой подход:
В файле.aspx я добавил это в Gridview:
OnRowCreated="CreateRow"
И в коде позади я добавил следующий метод:
protected void CreateRow(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
GridView gridView = (GridView)sender;
GridViewRow row = new GridViewRow(1, 0, DataControlRowType.Header, DataControlRowState.Normal);
TableCell th = new TableHeaderCell();
th.HorizontalAlign = HorizontalAlign.Center;
th.ColumnSpan = UserGV.Columns.Count;
th.ForeColor = Color.White;
th.BackColor = Color.SteelBlue;
th.Font.Bold = true;
th.Text = "Manage Users";
row.Cells.Add(th);
gridView.Controls[0].Controls.AddAt(0, row);
}
}
Теперь все работает правильно.
В шаблоне редактирования установите
selectedvalue
из привязок данных, вы получите правильное выбранное значение вместо нуля.
SelectedValue='<%# Bind("DeptCode") %>'