65.9K
CodeProject 正在变化。 阅读更多。
Home

在 DataList 中显示运行时彩色项并处理 DataListItem 复选框事件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (8投票s)

2012年8月13日

CPOL

4分钟阅读

viewsIcon

29142

downloadIcon

539

本文讨论了根据一些预定义条件以不同颜色显示 DataList 项目的方法。

介绍  

当我们需要根据一些预定义条件以不同颜色显示 DataList 项目时,有很多情况。 此外,在每个 datalist 项目中都有一个 checkbox,并且我们需要识别并处理任何特定项目的检查更改事件,这种情况也很多。 本文讨论了如何实现此功能。

背景  

datalist 中的每个项目都以默认样式显示。 datalist 控件具有以某种样式显示项目和交替项目的机制。 在某些情况下,我们需要根据包含的数据指定项目的某种样式,而不是简单的项目和交替项目样式。 这可以通过处理 ItemDataBound 事件轻松完成。 另一种方法是解析所有项目和数据,并根据内部数据更改项目的颜色。

另一个常见问题是处理 datalist 控件的特定于项目的事件。 例如,如果我们有一个 checkboxdatalist 的每个项目中,那么我们如何独立地处理每个项目的复选框更改事件。 这可以通过在单个位置(即所有 datalist 项目 复选框 的单个事件处理程序)中处理复选框更改事件来实现,然后通过识别已选中的实际 复选框 来对该事件采取行动。

使用代码

让我们实现一个小应用程序,该应用程序将根据某些条件以不同的颜色显示项目。 然后,我们将找出通过处理每个项目的已选中更改事件选中了哪些项目,然后处理已选中的项目。(为了简单起见,我们只会将这些项目推送到数据库表中,在现实世界中,可能需要对这些项目采取其他操作)

让我们从为这个小型演示应用程序创建数据库表模式开始。

在上面的图片中,有两个表。 TblStuDetails 是一个表,其数据将显示在 datalist 中。 决定颜色的因素将是此表的 TYPE 字段。 根据类型显示颜色的规则如下:

"F" 蓝色
"A" 绿色
"H" 红色
"G" 黄色
"B" 紫罗兰色

第二个表 tblSelectedID 是一个表,我们将在此表中插入选定的项目 ID。 此表更多地用于演示目的,以显示 复选框 事件如何与回发协同工作。

现在让我们看看我们如何将 Datalist 项目绑定到从数据库中提取的数据。

private void fillDatalist()
{
    using (SqlConnection sqlConn = new SqlConnection(connString))
    {
        string strSQL = "SELECT [id],[StuName],[Type],convert(varchar,[DateOfBirth],103) as [DateOfBirth],[Age] FROM [tblStuDetails]";
        using (da = new SqlDataAdapter(strSQL, sqlConn))
        {
            if (sqlConn.State != ConnectionState.Open)
            {
                sqlConn.Open();
            }

            using (table = new DataTable())
            {
                da.Fill(table);

                if (table.Rows.Count > 0)
                {
                    DataList1.DataSource = table;
                    DataList1.DataBind();
                }
            }                
        }
    }
}   

现在,第二项任务是识别项目的 TYPE 并更改此 Datalist 项目的颜色。

private void UpdateColors()
{
    foreach (DataListItem item in DataList1.Items)
    {
        Label lbl = (Label)item.FindControl("Label1");
        switch (lbl.Text)
        {
            case "F":
                item.BackColor = System.Drawing.Color.Blue;
                break;
            case "A":
                item.BackColor = System.Drawing.Color.Green;
                break;
            case "H":
                item.BackColor = System.Drawing.Color.Red;
                break;
            case "G":
                item.BackColor = System.Drawing.Color.Yellow;
                break;
            case "B":
                item.BackColor = System.Drawing.Color.Violet;
                break;
        }
    }
}

现在我们需要在第一次运行时将 datalist 与项目绑定,但我们需要在 postback 之后保留颜色。 为此,我们需要在每次 postback 上调用 UpdateColors 函数,而在第一次加载时仅调用 Databind

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        fillDatalist();
    }        

    UpdateColors();        
}

现在,当我们运行应用程序时,我们可以看到 datalist 项目以不同的颜色显示,即所需的结果。

现在本文的第二个目标是识别独立的 checkbox 更改。 这可以通过让一个函数在每次 checkbox 的 check_Changed 事件上被调用来实现。 在此事件中,我们将识别项目并采取一些操作。

protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
    StringBuilder sel = new StringBuilder();
    foreach (DataListItem li in DataList1.Items)
    {
        if (li.ItemType == ListItemType.Item || li.ItemType == ListItemType.AlternatingItem)
        {
            CheckBox cb = li.FindControl("CheckBox1") as CheckBox;
            if (cb != null)
            {
                if (cb.Checked)
                {
                    sel.Append(cb.Text + ",");
                }
            }
        }
    }

    lblSelected.Text = sel.ToString();
}

注意:这里的想法是将所有选定的项目保存在一个以 "," 分隔的列表中,然后当用户选择提交时,我们将把它们推送到数据库中。 所以让我们看看我们将选定数据推送到数据库的代码。

protected void Button1_Click(object sender, EventArgs e)
{
    string[] strSelected;
    string finalvalue = string.Empty;
    int recordsUpdated = 0;

    finalvalue = lblSelected.Text.Substring(0, lblSelected.Text.Length - 1);
    strSelected = finalvalue.Split(',');

    if (strSelected.Length > 0)
    {
        for (int i = 0; i < strSelected.Length; i++)
        {
            using (SqlConnection sqlConn = new SqlConnection(connString))
            {
                string strSQLInsert = "insert into tblSelectedID(id) values(@strSelected)";
                using (SqlCommand cmd =sqlConn.CreateCommand())
                {
                    cmd.CommandText = strSQLInsert;
                    cmd.CommandType = CommandType.Text;
                    cmd.Parameters.AddWithValue("@strSelected", strSelected[i].ToString());

                    if (sqlConn.State != ConnectionState.Open)
                    {
                        sqlConn.Open();
                    }
                    recordsUpdated += cmd.ExecuteNonQuery();
                }
            }
        }

        if (recordsUpdated > 0)
        {
            lblResult.Text = string.Format("{0} Records Saved Successfully", recordsUpdated);
        }
    }
}

现在,当我们运行应用程序,选择 复选框 并点击保存按钮。

因此,我们现在有一个 datalist,它根据项目中存在的数据显示自定义样式,并且能够独立处理每个项目的 复选框 更改事件。

看点

我写这篇小文章的主要原因是在 CodeProject 的快速解答部分中收到的查询数量。 许多开发人员正在努力使此功能正常工作。 我认为,我应该提供一篇基线文章来解释如何完成此操作,以便其他人可以从中受益。

历史

2012 年 8 月 13 日: 发布第一个版本。
© . All rights reserved.