【问题标题】:How to programmatically set a ASP.NET Web Forms dropdownlist selecteditem and selectedindex如何以编程方式设置 ASP.NET Web 窗体下拉列表 selecteditem 和 selectedindex
【发布时间】: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 中的一个项目。

标签: c# asp.net webforms


【解决方案1】:

我想你可能在这里寻找的是FindByText,而不是FindByValue。项目的值将是SubjectID 列,而项目的文本将匹配标签的文本。

【讨论】:

  • 我刚刚尝试了 FindByText,得到了相同的结果。我想知道是否需要将其放在不同的事件中。我从 OnRowDataBound 事件中调用它。
  • 奇怪。如果您打破该行 (ddlSubject.Items.FindByValue((e.Row.FindControl("lblSubject") as Label).Text).Selected = true;) 并检查标签的 text 属性的值,您是否 100% 确定 ddlSubject.Items 列表中有一个项目具有完全相同的文本(包括大小写)?我知道您提到您在其他评论中已经检查过,但似乎这一定是问题所在 - 也许项目集合实际上没有被填充?
  • 这是一个数据完整性问题。下拉列表中的每个项目都有尾随空格。所以没有比赛。我已经修剪了项目值并且它有效。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多