【发布时间】:2018-04-10 21:02:17
【问题描述】:
我看过多篇关于这个主题的帖子,答案几乎相同。要以编程方式设置选定项,请使用以下代码:
DropDownList1.DataBind(); // get the data into the list you can set it
DropDownList1.Items.FindByValue("SOMECREDITPROBLEMS").Selected = true;
我的情况略有不同。我正在尝试在 gridview 中设置下拉列表的值。
我可以填充下拉列表,但无法设置 selecteditem 或 selectedindex。
网格视图
<asp:GridView ID="gvSubject" runat="server"
CssClass="table table-striped clientTblEnabled"
OnRowDataBound="gvSubject_RowDataBound"
AutoGenerateColumns="false"
OnPreRender="gvSubject_PreRender"
GridLines="Both" PageSize="50">
<Columns>
<asp:TemplateField HeaderText="Subject Date">
<ItemTemplate>
<asp:Label ID="lblSubjectDate" runat="server" Text='<%# Bind("SubjectDateTime", "{0:MM/dd/yyyy}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Subject">
<ItemTemplate>
<asp:Label ID="lblSubject" runat="server" Text='<%# Bind("SubjectDesc") %>' Visible="false"></asp:Label>
<asp:DropDownList ID="ddlSubject" runat="server" CssClass="input-xlarge controls"></asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>
No Results found
</EmptyDataTemplate>
</asp:GridView>
填充下拉列表
protected void gvSubject_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DropDownList ddlSubject = e.Row.FindControl("ddlSubject") as DropDownList;
if (ddlSubject != null)
{
DataSet ds = GetControlData("ddlSubject");
ddlSubject.DataSource = ds.Tables[8];
ddlSubject.DataTextField = "SubjectDesc";
ddlSubject.DataValueField = "SubjectID";
ddlSubject.DataBind();
ddlSubject.Items.FindByValue((e.Row.FindControl("lblSubject") as Label).Text).Selected = true;
}
}
}
lblSubject 由 GetControlData() 中的另一个查询填充。
当调试器访问 ddlSubject.Items.FindByValue 代码时,即使 lblSubject 有值,我也会收到 NullReferenceException。
我想知道是否需要更改要为其加载数据的 gridview 事件。
【问题讨论】:
-
是
(e.Row.FindControl("lblSubject") as Label)为空,还是FindByValue的结果?你确定 lblSubject 的文本值(你说它是由另一个查询设置的)确实存在于下拉列表填充的项目列表中吗? -
@MajorRefactoring FindByValue 的结果为空。 lblSubject 确实有一个值,并且该值和大小写匹配 ddlSubject 中的一个项目。