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






4.56/5 (8投票s)
本文讨论了根据一些预定义条件以不同颜色显示 DataList 项目的方法。
介绍
当我们需要根据一些预定义条件以不同颜色显示 DataList
项目时,有很多情况。 此外,在每个 datalist
项目中都有一个 checkbox
,并且我们需要识别并处理任何特定项目的检查更改事件,这种情况也很多。 本文讨论了如何实现此功能。
背景
datalist
中的每个项目都以默认样式显示。 datalist
控件具有以某种样式显示项目和交替项目的机制。 在某些情况下,我们需要根据包含的数据指定项目的某种样式,而不是简单的项目和交替项目样式。 这可以通过处理 ItemDataBound
事件轻松完成。 另一种方法是解析所有项目和数据,并根据内部数据更改项目的颜色。
另一个常见问题是处理 datalist
控件的特定于项目的事件。 例如,如果我们有一个 checkbox
在 datalist
的每个项目中,那么我们如何独立地处理每个项目的复选框更改事件。 这可以通过在单个位置(即所有 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 的快速解答部分中收到的查询数量。 许多开发人员正在努力使此功能正常工作。 我认为,我应该提供一篇基线文章来解释如何完成此操作,以便其他人可以从中受益。