以编程方式设置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

错误消息不言自明。根据您拥有的数据源,您的网格视图中的控件正在动态创建,之后它将尝试设置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
}