获取TemplateField中的当前行颜色?

时间:2009-03-13 14:26:48

标签: c# asp.net templates gridview

我遇到一种情况,我需要知道GridView的TemplateField中交替行的当前颜色。

更新:

如何在<%# ??? %>中检索此颜色值。

(或者我得到行号的解决方法)。

5 个答案:

答案 0 :(得分:1)

从&lt; %%&gt;内部获取颜色在模板字段本身中标记,您可以使用此代码...

<asp:TemplateField>
    <ItemTemplate>
        <%# ((GridViewRow)Container).RowState == DataControlRowState.Alternate ? ((GridView)((GridViewRow)Container).Parent.Parent).AlternatingRowStyle.BackColor : ((GridView)((GridViewRow)Container).Parent.Parent).RowStyle.BackColor%>
    </ItemTemplate>
</asp:TemplateField>

您也可以在GridView的RowDataBound事件中执行此操作。在RowDataBound命令中,您可以查询e.Row.RowState以找出您所在的行类型。值包括DataControlRowState.Alternate和DataControlRowState.Normal。您可以使用发件人根据该行类型获取颜色...

protected void MyGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{

    // set first cell in the row to color just for demonstration purpose.
    if (e.Row.RowType == DataControlRowType.DataRow && e.Row.RowState == DataControlRowState.Alternate)
    {
        e.Row.Cells[0].Text = ((GridView)sender).AlternatingRowStyle.BackColor.ToString();
    }
}

答案 1 :(得分:1)

在您的代码隐藏页面(或.aspx页面的某个部分)中创建此功能:

protected string GetColor(object container)
        {
            int ordinal = 0;
            try
            {
                ordinal = int.Parse(DataBinder.Eval(container, "DataItemIndex").ToString());
            }
            catch (Exception)
            {
                ordinal = int.Parse(DataBinder.Eval(container, "ItemIndex").ToString());
            }
            return (ordinal % 2) == 0 ? "Row" : "Alternate Row";
        }

然后在你的标记中,你会这样称呼它:

<%# GetOrdinal(Container) %>

(注意大写的“容器”)。

答案 2 :(得分:1)

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        e.Row.Attributes.Add("style", "cursor:help;");
        if (e.Row.RowType == DataControlRowType.DataRow && e.Row.RowState == DataControlRowState.Alternate)
        { 
            if (e.Row.RowType == DataControlRowType.DataRow)
            {                
                e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='orange'");
                e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#E56E94'");
                e.Row.BackColor = Color.FromName("#E56E94");                
           }           
        }
        else
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='orange'");
                e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='gray'");
                e.Row.BackColor = Color.FromName("gray");                
            }
            //e.Row.Cells[0].BackColor = Color.FromName("gray");
            //e.Row.Cells[1].BackColor = Color.FromName("gray");
            //e.Row.Cells[2].BackColor = Color.FromName("gray");
            //e.Row.Cells[3].BackColor = Color.FromName("gray");
            //e.Row.Cells[4].BackColor = Color.FromName("gray");
            //e.Row.BorderWidth = 2;
            //e.Row.BorderColor = Color.FromName("#43C6DB");
        }
    }

答案 3 :(得分:0)

这可能是一种奇怪的解决方法,但您可以随时检查您要检查的行是奇数行还是偶数行。如果是偶数,则可能使用AlternatingRow模板中设置的颜色。如果是偶数,则应该使用常规的Row模板。

答案 4 :(得分:0)

GridView如何改变颜色 - 每隔一行或X的块?或者它是以一种更“随机”的方式设置的?

如果是每隔一行,您只需检查该行是“正常”行还是“交替”行。

我不记得它是怎么写的,我只找到了这个VB的例子,但它可能会有所帮助:

If e.Row.RowState = DataControlRowState.Normal Then
 //do stuff
ElseIf e.Row.RowState = DataControlRowState.Alternate Then
 //do other stuff

其中e是GridView对象。但这并不会检查行的实际颜色。我想你应该能够做到这样的事情:

if(System.Drawing.Color.Red == e.Row.BackColor)

如果可以,请详细说明每行的颜色设置。