我有 GridView 将数据显示为标签
<ItemTemplate>
<asp:Label ID="lblIsActive" runat="server" Text='<%# GetIcon((String)Eval("IS_ACTIVE"))%>' SkinID='<%# GetSkinId((String)Eval("IS_ACTIVE"))%>' />
</ItemTemplate>
C#
protected string GetSkinId(string name)
{
if (name == "Y")
{
return "sknActive";
}
else
return "sknInactive";
}
但是我收到错误我无法设置SkinID
以编程方式,我知道如何在代码中允许SkinID
?
更新 我决定不制作SkinID,所以我正在做这个
<ItemTemplate>
<asp:Label ID="lblIsActive" runat="server" Text='<%# GetIcon((String)Eval("IS_ACTIVE"))%>'
ForeColor='<%# GetColor((String)Eval("IS_ACTIVE"))%>' />
</ItemTemplate>
我在c#上的功能获得颜色
protected string GetColor(string name)
{
if (name == "Y")
{
return "#99099";
}
else
return "#03211";
}
我收到错误
字符串无法转换为System.Drawing
答案 0 :(得分:1)
错误消息告诉您需要执行的操作:将SkinID
属性的初始化移至page lifecycle的Page_PreInit
阶段。
基本上,这需要在后面的代码中添加以下事件处理程序:
protected void Page_PreInit(object sender, EventArgs e)
{
lblIsActive.SkinId = GetSkinID(IS_ACTIVE); // no need for eval here
}
答案 1 :(得分:1)
错误消息是不言自明的。基于数据源,您可以动态地创建gridview中的控件,然后尝试设置 SkinId 属性,从而设置错误。
您可以在gridview中创建行时实现此目的。是的,你可以像这样使用gridvew的RowCreated事件: -
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Label lblIsActive = e.Row.FindControl("lblIsActive") as Label;
if(lblIsActive.Text == "Y")
lblIsActive.SkinID = "sknActive";
else
lblIsActive.SkinID = "sknInactive";
}
}
请注意,不会在RowDataBound事件中工作,因为在创建行并且数据行绑定到数据后会触发此事件。
<强>更新强>
首先,你的假设是错误的,我们循环实际上我们不是。我们只是处理gridview控件引发的事件。无论如何,从现在开始你已经改变主意并切换到ForeColor
接近你的代码的问题是ForeColor属性需要一个System.Drawin.Color枚举但你传递一个字符串因此错误。对于correctint,您必须返回Color
而不是像这样的字符串: -
protected Color GetColor(string name)
{
if (name == "Y")
return Color.Red;
else
return Color.Green;
}
这里我将返回样本颜色,但您需要将它们替换为实际的预期颜色。如果您只有十六进制字符串且不确定Color
枚举值,那么您可以使用this answer中提到的方法来执行此操作。