Получить текущий цвет строки в TemplateField?

У меня есть ситуация, когда мне нужно знать текущий цвет чередующейся строки в TemplateField GridView.

ОБНОВЛЕНО:

Как получить это значение цвета в файле <%# ??? %>.

(Или обходной путь, где я получаю номер строки).


person Niels Bosma    schedule 13.03.2009    source источник
comment
Неясно, где (т.е. в каком обработчике событий и на каком этапе процесса привязки данных gridview) вы хотите получить указанный цвет?   -  person Cerebrus    schedule 13.03.2009


Ответы (4)


Создайте эту функцию на странице кода программной части (или в разделе страницы .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) %>

(Обратите внимание на заглавную букву «Контейнер»).

person elo80ka    schedule 13.03.2009

Чтобы получить цвета внутри тега ‹% %> в самом поле шаблона, вы можете использовать этот код...

<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>

Вы также можете сделать это в событии RowDataBound GridView. В команде 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();
    }
}
person Scott Ivey    schedule 13.03.2009

Это может быть странным обходным путем, но вы всегда можете проверить, является ли строка, которую вы проверяете, четной или нечетной строкой. Если это четное число, скорее всего, используется цвет, заданный в шаблоне AlternatingRow. Если он четный, он должен использовать обычный шаблон Row.

person TheTXI    schedule 13.03.2009

Как 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)

Если можно, пожалуйста, подробнее о том, как задается цвет в каждой строке.

person Marcus L    schedule 13.03.2009
comment
‹RowStyle BackColor=#E9CE90›‹/RowStyle› ‹AlternatingRowStyle BackColor=#F6EED5›‹/AlternatingRowStyle› - person Niels Bosma; 13.03.2009
comment
Тогда вам действительно не нужно знать цвет, а только тип строки (обычный, чередующийся). Если это нормально, вы знаете, что цвет #E9CE90, иначе это #F6EED5. Мой пример VB должен помочь вам на вашем пути. - person Marcus L; 13.03.2009
comment
Типичная информация, которую хорошо иметь в вопросе с самого начала. Неважно, я думаю, Скотт только что дал тебе то, что тебе нужно. - person Marcus L; 13.03.2009