Как установить RowStyle строки GridView в зависимости от свойства объекта, с которым связана строка - PullRequest
5 голосов
/ 20 января 2010

В настоящее время я использую GridView и хочу установить класс CssClass для строки в зависимости от свойства объекта, с которым связана строка.

Я попробовал следующее, но это не работает (см. Комментарии):

<asp:GridView id="searchResultsGrid" runat="server" AllowPaging="true" PageSize="20" AutoGenerateColumns="false">

<!-- The following line doesn't work because apparently "Code blocks 
aren't allowed in this context: -->
  <RowStyle CssClass="<%#IIF(DataBinder.Eval(Container.DataItem,"NeedsAttention","red","") %>

  <Columns>
<!--............-->
  </Columns>
</asp:GridView>

Теперь я могу просто обработать событие RowDataBound GridView и изменить там класс css строки ... но я пытаюсь сохранить четкое разделение между пользовательским интерфейсом и уровнями страницы / бизнес-логики.

Я понятия не имею, как этого добиться, и я с нетерпением жду каких-либо предложений.

Спасибо

-Фринни

Ответы [ 3 ]

4 голосов
/ 20 января 2010

Вы не можете сделать это в декларативной разметке.

Почти все декларативные свойства GridView (включая GridView.RowStyle) являются настройками уровня сетки, а не уровня строки. Кроме TemplateFields они не являются связанными контейнерами данных, поэтому у них нет доступа к данным в их строках.

Если вы хотите сохранить эту логику в шаблоне .aspx, ваш единственный реальный вариант - использовать поля шаблона и манипулировать их содержимым:

<asp:TemplateField>
    <ItemTemplate>
        <span class="<%# ((string)Eval("property3")) == "NeedsAttention" ? "red" : string.Empty %>">
            <%# Eval("property1") %>
        </span>
    </ItemTemplate>                        
</asp:TemplateField>

В зависимости от того, что вы хотите сделать, это может быть неудобно - у вас нет доступа к содержащему <td> (или <tr> в этом отношении), и вам придется повторить форматирование для каждой ячейки.

Класс GridView делает все возможное, чтобы скрыть от вас детали HTML и стиля. В конце концов, вы могли бы создать GridView управляющий адаптер , который даже не отображался бы как HTML-таблицы (Хотя вряд ли это может быть.)

Поэтому, даже если вы пытаетесь избежать этого, вам, вероятно, лучше всего с этим справиться в обработчике OnRowDataBound - или используйте Repeater (если это уместно).

2 голосов
/ 18 января 2011

Я знаю, что это был почти год, но если кто-то еще пытается это сделать, попробуйте подкласс GridView.

public class GridViewCSSRowBindable : GridView
{
  public string DataFieldRowCSSClass { get; set; }
  protected override void OnRowDataBound(GridViewRowEventArgs e)
  {
    base.OnRowDataBound(e);
    if (!string.IsNullOrEmpty(DataFieldRowCSSClass))
    {
      //This will throw an exception if the property does not exist on the data item:
      string cssClassString = DataBinder.Eval(e.Row.DataItem, DataFieldRowCSSClass) as string;
      if (!string.IsNullOrEmpty(cssClassString))
      {
        string sep = string.IsNullOrEmpty(e.Row.CssClass) ? string.Empty : " ";
        e.Row.CssClass += sep + cssClassString;
      }
    }
  }
}

А потом на вашей странице:

<custom:GridViewCSSRowBindable ID="gvExample" runat="server" DataFieldRowCSSClass="RowCSS">
</custom:GridViewCSSRowBindable>

Объекты, привязанные к этому примеру GridView, должны иметь свойство RowCSS с общедоступной строкой.

Если вы ранее не использовали унаследованные элементы управления, возможно, вам придется поискать, как настроить это в вашем проекте.

0 голосов
/ 21 апреля 2014
foreach (TableCell gvc in gvRowPhistry.Cells)
{
    gvc.ForeColor = System.Drawing.Color.Blue;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...