我在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
的第一行并使用第二行进行设置(只需对值进行硬编码),它将起作用。发生了什么事?
答案 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所说的那样,将查询字符串的格式设置错误。