【问题标题】:how to load sql datasource before select item value如何在选择项目值之前加载sql数据源
【发布时间】:2025-12-16 08:40:01
【问题描述】:

我的 asp.net 页面上有 SQL 数据源,页面加载时出现此错误

'ddlTypes' 有一个无效的 SelectedValue,因为它不存在于项目列表中。参数名称:值

private void GetQueryString(Uri tempUri)
{
    if (HttpUtility.ParseQueryString(tempUri.Query).Get("IntrestFocus") != null)
    {
        ddlTopics.SelectedValue = HttpUtility.ParseQueryString(tempUri.Query).Get("IntrestFocus"); 
    }

    else
        if (HttpUtility.ParseQueryString(tempUri.Query).Get("Skills") != null)
        {
            ddlSkills.SelectedValue = HttpUtility.ParseQueryString(tempUri.Query).Get("Skills"); 
        }
    else
        if(HttpUtility.ParseQueryString(tempUri.Query).Get("Type") != null)
        {
            ddlTypes.SelectedValue = HttpUtility.ParseQueryString(tempUri.Query).Get("Type"); 
        }

}
<asp:SqlDataSource ID="SqlDSTypes" runat="server" ConnectionString="<%$ ConnectionStrings:SiteSqlServer %>" SelectCommand="SELECT * FROM [Types]"></asp:SqlDataSource>


                <asp:DropDownList CssClass="selectpicker mobile-stack select-type" data-style="lts-white font-black drop-shadow select-height" ID="ddlTypes" runat="server" DataSourceID="SqlDSTypes" DataTextField="Description" DataValueField="Id" AppendDataBoundItems="True" ClientIDMode="Static">
                    <asp:ListItem Value="0">Select a Type</asp:ListItem>
                </asp:DropDownList>

【问题讨论】:

  • 您是否验证了设置为 SelectedValue 属性的值确实在绑定到它的项目的值列表中?你能只发布下拉菜单的客户端标记吗?还有,这里有3个ddl,哪个会出错?
  • 绑定下拉列表我使用asp:SqlDataSource

标签: c# asp.net sql datasource


【解决方案1】:

这是您的主要选择:

private void GetQueryString(Uri tempUri)
{
  ddlTopics.DataSource = SqlDSTypes.Select(DataSourceSelectArguments.Empty);
  ddlTopics.DataBind();

  //Put your logic here, behind databind ...
  if (HttpUtility.ParseQueryString(tempUri.Query).Get("IntrestFocus") != null)
  {
      ddlTopics.SelectedValue = HttpUtility.ParseQueryString(tempUri.Query).Get("IntrestFocus"); 
  }

  else
      if (HttpUtility.ParseQueryString(tempUri.Query).Get("Skills") != null)
      {
        ddlSkills.SelectedValue = HttpUtility.ParseQueryString(tempUri.Query).Get("Skills"); 
      }
  else
      if(HttpUtility.ParseQueryString(tempUri.Query).Get("Type") != null)
      {
        ddlTypes.SelectedValue = HttpUtility.ParseQueryString(tempUri.Query).Get("Type"); 
      }

}

当您选择上述答案时,还要确保未设置 DataSourceID。

但是,还有另一种可能性,即使用OnDataBound 事件并将DropDownList 逻辑放入其中。它将在DropDownList 被数据绑定之后触发:

你的代码:

protected function ddlTopics_DataBound(Object sender, EventArgs e)
{
  //Put your logic here, behind databind ...
  if (HttpUtility.ParseQueryString(tempUri.Query).Get("IntrestFocus") != null)
  {
      ddlTopics.SelectedValue = HttpUtility.ParseQueryString(tempUri.Query).Get("IntrestFocus"); 
  }

  else
      if (HttpUtility.ParseQueryString(tempUri.Query).Get("Skills") != null)
      {
        ddlSkills.SelectedValue = HttpUtility.ParseQueryString(tempUri.Query).Get("Skills"); 
      }
  else
      if(HttpUtility.ParseQueryString(tempUri.Query).Get("Type") != null)
      {
        ddlTypes.SelectedValue = HttpUtility.ParseQueryString(tempUri.Query).Get("Type"); 
      }  
}

你的aspx:

<asp:DropDownList ID="ddlTopics" OnDataBound="ddlTopics_DataBound" runat="server" ...

后者可能是最好的选择。

【讨论】: