无法设置下拉列表选择的项目

时间:2018-12-18 21:55:09

标签: c# asp.net webforms dropdown

我在ASP.Net网页上有一个a[:, b, c, d, :]列表。我正在尝试在页面加载时设置其SelectedValue`。我使用this page作为参考。这是我的代码:

DropDown

设置<asp:DropDownList runat="server" ID="ddlType" DataSourceID="sdsType" DataTextField="Name" DataValueField="AssetTypeID" /> <asp:SqlDataSource runat="server" ID="sdsType" ConnectionString='<%$ ConnectionStrings:SystemManagement %>' SelectCommand="SELECT AssetTypeID, [Name] FROM AssetType UNION SELECT 0, '' ORDER BY [Name]" SelectCommandType="Text" /> protected void Page_Load(object sender, EventArgs e) { if(!Page.IsPostBack) { if (Request.QueryString["searchtype"] != null) { ddlType.SelectedValue = ddlType.Items.FindByText(Request.QueryString["searchtype"]).Value; ddlType.SelectedValue = "1"; } } else { } } 的第一行将给我一个Null引用异常,如果我检查SelectedValue,则它没有项目。但是,如果我注释掉设置ddlType的第一行并使用第二行进行设置(只需对值进行硬编码),它将起作用。发生了什么事?

3 个答案:

答案 0 :(得分:3)

您可以使用OnDataBound事件来执行当前的逻辑

/*Note the addition of "OnDataBound" */
<asp:DropDownList runat="server" 
                  ID="ddlType" 
                  DataSourceID="sdsType" 
                  DataTextField="Name" 
                  DataValueField="AssetTypeID"
                  OnDataBound="ddlType_DataBound"                 
/>
<asp:SqlDataSource runat="server" ID="sdsType" ConnectionString='<%$ ConnectionStrings:SystemManagement %>' SelectCommand="SELECT AssetTypeID, [Name] FROM AssetType UNION SELECT 0, '' ORDER BY [Name]" SelectCommandType="Text" />

protected void ddlType_DataBound(object sender, EventArgs e)
{
    if(!Page.IsPostBack)
    {
        if (Request.QueryString["searchtype"] != null)
        {
            ddlType.SelectedValue = ddlType.Items.FindByText(Request.QueryString["searchtype"]).Value;
            ddlType.SelectedValue = "1";
        }
    }
    else
    {

    }
}

答案 1 :(得分:2)

当您尝试设置ddlType的值时,DataSource尚未加载到DropDown。如果您检查调试器,则ddlType.Items属性将向您显示它当前没有任何项,这说明了NullReference异常。

尝试在致电ddlType.DataBind()之前确保ddlType.Items具有数据库中的项目。

protected void Page_Load(object sender, EventArgs e)
{
    if(!Page.IsPostBack)
    {
        ddlType.DataBind(); // Load data from DataSource
        if (Request.QueryString["searchtype"] != null)
        {
            ddlType.SelectedValue = ddlType.Items.FindByText(Request.QueryString["searchtype"]).Value;
            ddlType.SelectedValue = "1";
        }
    }
    else
    {

    }
}

请确保在ddlType.DataBind()条件内包含if(!Page.IsPostBack),以避免在每个PostBack上从数据库加载数据。

答案 2 :(得分:-1)

删除!在if(!Page.IsPostBack)中,然后重试。 如果失败,则摆脱if语句。您可能会像MethodMan所说的那样,将查询字符串的格式设置错误。