【问题标题】:add attribute other than value to DropDownList items when using SqlDataSource使用 SqlDataSource 时向 DropDownList 项添加值以外的属性
【发布时间】:2015-06-11 17:56:48
【问题描述】:

我有一个 DropDownList 绑定到 SqlDataSource,如下所示:

<asp:DropDownList ID="ddlist" AppendDataBoundItems="True" DataSourceID="SqlDataSource1" DataTextField="name" DataValueField="value" AutoPostBack="True" runat="server">
    <asp:ListItem></asp:ListItem>
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" ConnectionString="<%$ ConnectionStrings:myConnectionString %>" SelectCommand="SELECT [name], [value] FROM [myTable]" runat="server"></asp:SqlDataSource>

我想将第三个数据库列绑定到另一个属性(不是值),例如数据库表列 DefaultBit 到 ListItem 属性 data-default 以便 DropDownList 呈现为

<select>
    <option></option>
    <option value="1" data-default="1">Line 1</option>
    <option value="2" data-default="0">Line 2</option>
</select>

我假设我需要在代码隐藏文件中以编程方式执行此操作,但我不清楚我是否仍将 SqlDataSource 绑定到 DropDownList 或者我是否应该打开一个连接并使用 SqlReader 遍历结果并更新DropDownList “手动”或其他更优雅的解决方案。

【问题讨论】:

标签: c# asp.net


【解决方案1】:

请尝试以下解决方案:

  1. 添加DropDownListSqlDataSource标记为(请注意我在select语句中添加了OnDataBound="ddlist_DataBound"和第三列)

    <asp:DropDownList ID="ddlist" AppendDataBoundItems="True" OnDataBound="ddlist_DataBound"
      DataSourceID="SqlDataSource1" DataTextField="name" DataValueField="value"
      AutoPostBack="True" runat="server">
        <asp:ListItem></asp:ListItem>
    </asp:DropDownList>
    
    <asp:SqlDataSource ID="SqlDataSource1" ConnectionString=
       "<%$ ConnectionStrings:myConnectionString %>" SelectCommand="SELECT [name], [value],
       [DefaultBit] FROM [myTable]" runat="server">
    </asp:SqlDataSource>
    
  2. 在方法"ddlist_DataBound"后面添加代码为:(请注意row[0]是名称,row[1]是值,row[2]是DefaultBit)

    protected void ddlist_DataBound(object sender, EventArgs e) {
        System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataView dv = (System.Data.DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
        dt = dv.ToTable();
    
        foreach (System.Data.DataRow row in dt.Rows) {
            ddlist.Items.FindByValue(row[1].ToString()).Attributes.Add("data-default", row[2].ToString());
        }
    }
    

我已经在应用程序中对其进行了测试,效果很好。

【讨论】:

  • 我独立地找到了相同的解决方案,所以你的回答让我更有信心,这是要走的路。我发现;但是,运行 onDataBound 方法后面的代码会导致该属性无法在回发中存活。相反,我使用了 onPreRender,以便在每次回发时添加属性。
猜你喜欢
  • 2017-08-26
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
相关资源
最近更新 更多