以编程方式设置SkinID
本文关键字:SkinID 设置 方式 编程 | 更新日期: 2023-09-27 18:26:37
我有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
错误消息不言自明。根据您拥有的数据源,您的网格视图中的控件正在动态创建,之后它将尝试设置SkinId属性,从而导致错误。
当在网格视图中创建行时,可以实现这一点。是的,你可以这样使用gridview的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
枚举值,那么您可以使用本答案中提到的方法来执行此操作。
错误消息告诉您需要做什么:将SkinID
属性的初始化移动到页面生命周期的Page_PreInit
阶段。
基本上,这需要在代码后面添加以下事件处理程序:
protected void Page_PreInit(object sender, EventArgs e)
{
lblIsActive.SkinId = GetSkinID(IS_ACTIVE); // no need for eval here
}