单独填充和绘制每个 gridview 单元格?
Fill and paint each gridview cell individually?
我有 sql table dbo.Clicks 看起来像这样:
ColNum Color RowNum Message
1 Gold 1 Text1
1 Black 2 Text2
2 Red 2 MoreText
2 Blue 3 TextX
我的存储过程returns 与此相同的数据。这是基础 datatable
:
Col1 Col2
-----------------------
Gold (null)
Black Red
(null) Blue
我在RowDataBound
中填写每个单元格:
protected void GridViewClicks_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
foreach (TableCell cell in e.Row.Cells)
{
cell.BackColor = ConvertFromHexToColor(cell.Text);
}
}
}
此代码有效,因为它用相应的背景颜色填充了单元格。
现在的问题是我还需要在每个单元格中显示我的 sql table [dbo.Clicks] 的内容。这就是我被困的地方。
另一种方法是每个数据table 单元格都包含颜色和文本,如果我使用样本数据,就像这样。然后我解析它:
Col1 Col2
Gold/Text1 (null)
Black/Text2 Red/MoreText
(null) Blue/TextX
但我认为必须有一种更优雅的方式来做到这一点。对我来说,这个解决方案非常难看。
我的网格视图如下所示:
<asp:GridView ID="GridViewClicks" runat="server" ShowHeader="False" onrowdatabound="GridViewClicks_RowDataBound">
</asp:GridView>
谢谢。
您可以使用带标签的模板字段并使用 Eval 分配样式属性。
public class SomeData
{
public string Data1 { get; set; }
public string Data2 { get; set; }
public string Color1 { get; set; }
public string Color2 { get; set; }
}
List<SomeData> lstData = new List<SomeData>()
{
new SomeData() {Data1 = "AAA", Color1 = "Red", Data2 = "ZZZ", Color2 = "Green"},
new SomeData() {Data1 = "BBB", Color1 = "Blue", Data2 = "PPP", Color2 = "Gold"},
new SomeData() {Data1 = "CCC", Color1 = "Red", Data2 = "ZZZ", Color2 = "Yellow"},
};
grdView.DataSource = lstData;
grdView.DataBind();
使用如下模板字段创建 Gridview
<asp:GridView runat="server" ID="grdView" AutoGenerateColumns="False" >
<Columns>
<asp:TemplateField HeaderText="Data1">
<ItemTemplate>
<asp:Label ID="lblColor1" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Data1") %>' style= <%# String.Concat("background-color:",Eval("Color1")) %> ></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Data2">
<ItemTemplate>
<asp:Label ID="lblColor2" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Data2") %>' style= <%# String.Concat("background-color:",Eval("Color2")) %>></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
这一点可以帮到您
style= <%# String.Concat("background-color:",Eval("Color2")) %>
您可以在 OnRowDataBound
事件中使用 DataRowView
并从一行中获取各个值并将它们应用于特定单元格。
if (e.Row.RowType == DataControlRowType.DataRow)
{
//cast the dataitem back to a datarowview
DataRowView row = e.Row.DataItem as DataRowView;
//use the data from the datarowview to specify color and contents for specific cells
e.Row.Cells[0].BackColor = Color.FromName(row["Color"].ToString());
e.Row.Cells[0].Text = row["RowNum"].ToString();
e.Row.Cells[1].BackColor = Color.FromName(row["Color"].ToString());
e.Row.Cells[1].Text = row["Message"].ToString();
}
更新
如果 GridView 有 3 列,DataSource 有 6 列,交替使用 text/color 值,您可以创建一个循环
if (e.Row.RowType == DataControlRowType.DataRow)
{
//cast the dataitem back to a datarowview
DataRowView drv = e.Row.DataItem as DataRowView;
//loop all the items in the datarowview (not equal to columns in grid)
for (int i = 0; i < drv.Row.ItemArray.Length; i++)
{
//check if it is an uneven column
if (i % 2 == 0)
{
e.Row.Cells[i / 2].Text = drv[i].ToString();
}
else
{
e.Row.Cells[i / 2].BackColor = Color.FromName(drv[i].ToString());
}
}
}
我有 sql table dbo.Clicks 看起来像这样:
ColNum Color RowNum Message
1 Gold 1 Text1
1 Black 2 Text2
2 Red 2 MoreText
2 Blue 3 TextX
我的存储过程returns 与此相同的数据。这是基础 datatable
:
Col1 Col2
-----------------------
Gold (null)
Black Red
(null) Blue
我在RowDataBound
中填写每个单元格:
protected void GridViewClicks_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
foreach (TableCell cell in e.Row.Cells)
{
cell.BackColor = ConvertFromHexToColor(cell.Text);
}
}
}
此代码有效,因为它用相应的背景颜色填充了单元格。
现在的问题是我还需要在每个单元格中显示我的 sql table [dbo.Clicks] 的内容。这就是我被困的地方。
另一种方法是每个数据table 单元格都包含颜色和文本,如果我使用样本数据,就像这样。然后我解析它:
Col1 Col2
Gold/Text1 (null)
Black/Text2 Red/MoreText
(null) Blue/TextX
但我认为必须有一种更优雅的方式来做到这一点。对我来说,这个解决方案非常难看。
我的网格视图如下所示:
<asp:GridView ID="GridViewClicks" runat="server" ShowHeader="False" onrowdatabound="GridViewClicks_RowDataBound">
</asp:GridView>
谢谢。
您可以使用带标签的模板字段并使用 Eval 分配样式属性。
public class SomeData
{
public string Data1 { get; set; }
public string Data2 { get; set; }
public string Color1 { get; set; }
public string Color2 { get; set; }
}
List<SomeData> lstData = new List<SomeData>()
{
new SomeData() {Data1 = "AAA", Color1 = "Red", Data2 = "ZZZ", Color2 = "Green"},
new SomeData() {Data1 = "BBB", Color1 = "Blue", Data2 = "PPP", Color2 = "Gold"},
new SomeData() {Data1 = "CCC", Color1 = "Red", Data2 = "ZZZ", Color2 = "Yellow"},
};
grdView.DataSource = lstData;
grdView.DataBind();
使用如下模板字段创建 Gridview
<asp:GridView runat="server" ID="grdView" AutoGenerateColumns="False" >
<Columns>
<asp:TemplateField HeaderText="Data1">
<ItemTemplate>
<asp:Label ID="lblColor1" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Data1") %>' style= <%# String.Concat("background-color:",Eval("Color1")) %> ></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Data2">
<ItemTemplate>
<asp:Label ID="lblColor2" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Data2") %>' style= <%# String.Concat("background-color:",Eval("Color2")) %>></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
这一点可以帮到您
style= <%# String.Concat("background-color:",Eval("Color2")) %>
您可以在 OnRowDataBound
事件中使用 DataRowView
并从一行中获取各个值并将它们应用于特定单元格。
if (e.Row.RowType == DataControlRowType.DataRow)
{
//cast the dataitem back to a datarowview
DataRowView row = e.Row.DataItem as DataRowView;
//use the data from the datarowview to specify color and contents for specific cells
e.Row.Cells[0].BackColor = Color.FromName(row["Color"].ToString());
e.Row.Cells[0].Text = row["RowNum"].ToString();
e.Row.Cells[1].BackColor = Color.FromName(row["Color"].ToString());
e.Row.Cells[1].Text = row["Message"].ToString();
}
更新
如果 GridView 有 3 列,DataSource 有 6 列,交替使用 text/color 值,您可以创建一个循环
if (e.Row.RowType == DataControlRowType.DataRow)
{
//cast the dataitem back to a datarowview
DataRowView drv = e.Row.DataItem as DataRowView;
//loop all the items in the datarowview (not equal to columns in grid)
for (int i = 0; i < drv.Row.ItemArray.Length; i++)
{
//check if it is an uneven column
if (i % 2 == 0)
{
e.Row.Cells[i / 2].Text = drv[i].ToString();
}
else
{
e.Row.Cells[i / 2].BackColor = Color.FromName(drv[i].ToString());
}
}
}