2

我有一个下拉列表框,如下所示。在某些情况下,在数据绑定事件中,我想删除 bitActive 设置为 0(非活动)的项目。我没有在 selectCommand 中放置 WHERE bitAcive!=0,因为我只想在某些条件下删除它们。有什么方法可以迭代项目并检查 bitActive 的值吗?

<tr>
            <td width="30%" align="right">Location<span class="littlefont">*</span></td>
            <td width="70%" align="left">
                <asp:DropDownList ID="ddlLocation" runat="server" 
                    DataSourceID="SqlDSLocation" DataTextField="txtRefLocation_Name" 
                    DataValueField="intRefLocation_ID" ondatabound="ddlLocation_DataBound">
                </asp:DropDownList>
                <asp:SqlDataSource ID="SqlDSLocation" runat="server" 
                    ConnectionString="<%$ ConnectionStrings:SPRConnectionString %>" 
                    SelectCommand="SELECT DISTINCT [intRefLocation_ID], [txtRefLocation_Name], [location], [bitActive] FROM [tblRefLocation] ORDER BY [intRefLocation_ID]">
                </asp:SqlDataSource>
            </td>
        </tr> 
4

2 回答 2

1

在代码隐藏中,您可以调用该SQLDataSource.Select()方法:

System.Data.DataView dv = (System.Data.DataView)SqlDSLocation.Select(DataSourceSelectArguments.Empty);

然后遍历返回的行,找到设置为零的“bitActive”行并将它们从您的DropDownList(上面链接的示例中被黑客入侵的代码排序)中删除:

foreach(System.Data.DataRow row in dv.Table.Rows)
{
    // This is approximate logic, tailor this to fit your actual data
    if (row["bitActive"].ToString() == "False")
    {
        ddlLocation.Items.Remove(row["intRefLocation_ID"].ToString());
    }
}

请注意,这不会从您的 SQL 表中删除这些行。确保在此之后不要DropDownList再次对您的数据进行数据绑定 - 否则您刚刚删除的所有内容都会返回。

编辑:有关更高效和优雅的解决方案,请参阅James Johnson 的回答

于 2012-04-02T16:39:17.380 回答
1

与其删除ItemDataBound事件中的项目,不如在绑定之前过滤数据源?:

var table = new DataTable("MyTable"); //assume it's populated
if (table.Rows.Count > 0)
{
    var results = table.AsEnumerable().Where(r => r.bitActive).AsDataView().ToTable();
    if (!results.HasErrors)
    {
        DropDownList1.DataSource = results;
        DropDownList1.DataBind();
    }        
}
于 2012-04-02T16:53:14.870 回答