我在ASP.Net网页上有一个DropDown列表。我正在尝试在页面加载时设置它的SelectedValue`。我正在使用this page作为参考。下面是我的代码:
<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
{
}
}设置SelectedValue的第一行将给我一个空引用异常,如果我检查ddlType,它没有任何项。但是,如果我注释掉设置SelectedValue的第一行,并使用第二行设置它(只需对值进行硬编码),它就可以工作。到底怎么回事?
发布于 2018-12-19 08:19:47
您可以使用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
{
}
}发布于 2018-12-19 08:03:57
当您尝试设置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上从数据库加载数据。
https://stackoverflow.com/questions/53841669
复制相似问题