Должен ли я написать свою собственную реализацию GridView? - PullRequest
3 голосов
/ 12 марта 2009

Я не слишком много работал с GridView и, покинув его, обнаружил, что он более сложный, чем мне нужно, но мне не хватает некоторых базовых способностей, которые, как я ожидаю, он будет иметь. Нет сомнений в том, что его реализация имеет смысл, учитывая его 90-процентную цель быть привязанным к набору данных, особенно когда это делается декларативно, но я намерен связать его с IEnumerable<T> в коде.

Мне нужна способность легко выполнять следующие действия

  • a) быть привязанным к IEnumerable<T>, где столбцы могут быть ограничены только определенными свойствами типа T
  • b) запросить возвращение коллекции своих строк, где каждая строка может иметь ячейку, ищемую по свойству, с которым ячейка была связана

в принципе, было бы неплохо реализовать следующий интерфейс

public interface IEasyGridBinder {
  void Bind<T>(IEnumerable<T> bindableObjects, params string[] propertiesToBind);
  IList<IDictionary<string, string>> Values {get;}
}

Итак, чтобы получить это, я должен написать свой собственный EasyGridBinder, который наследует от GridView и реализует этот интерфейс, или есть действительно простой способ сделать эти вещи, с которыми я просто незнаком?

P.S. Бонусные баллы, если я могу написать что-то вроде

myGrid.Bind(myEntities, e=>{e.Id; e.Name; e.Customer.Name;});

Но я полагаю, что смогу понять это сам после прочтения выражений

Дополнительный вопрос: Нет ли способа получить исходные данные, которые были введены в сетку и не были преобразованы в html? Если поле, полученное в качестве входных данных, содержит пустую строку, то в ячейке, по-видимому, содержится "", поэтому нет ли способа отличить ввод пустой строки от пробела? Если это действительно так, то я, вероятно, в конечном итоге буду реализовывать большую часть функциональности GridView.

Ответы [ 3 ]

2 голосов
/ 12 марта 2009

LinqDataSource позволяет указать ваш объект в качестве резервного хранилища для источника данных. Затем вы привязали бы GridView к этому источнику данных. Это немного больше декларации в .aspx, но это меньше кода для поддержки позже, так как раздувание функций приближает и приближает к повторной реализации GridView.

1 голос
/ 12 марта 2009

Если вы установите для свойства GridViews AutoGenerateColumns значение false, оно будет генерировать только указанные вами столбцы. Это можно сделать, создав BoundFields и добавив их в коллекцию Gridview Columns.

GridView gv = new GridView();
gv.AutoGenerateColumns = false;

BoundField bf = new BoundField();
bf.DataField = "Id";
bf.HeaderText = "ID";
gv.Columns.Add(bf);

BoundField bf = new BoundField();
bf.DataField = "Name";
bf.HeaderText = "Name";
gv.Columns.Add(bf);

BoundField bf = new BoundField();
bf.DataField = "Customer.Name";
bf.HeaderText = "Customer Name";
gv.Columns.Add(bf);

gv.DataSource = IEnumerable<T>;
gv.DataBind();

Я написал это объяснение в комментариях, но решил переместить его туда, где оно было бы более заметным, и добавить пример кода:

Чтобы сделать вышеупомянутый динамический, создайте класс GridViewDisplayAttribute, который наследуется от Attribute. Присвойте GridViewDisplayAttribute свойство HeaderText. Украсьте свойства T, указав HeaderText. Итерируя свойства T, создавая BoundFields для каждого оформленного свойства, используя HeaderText.

Пример быстрого непроверенного кода:

using System;
public class GridViewDisplayAttribute : Attribute
{
public GridViewDisplayAttribute(string headerText)
{
        HeaderText = headerText;
}
    public readonly bool HeaderText;
}

GridView gv = new GridView();
gv.AutoGenerateColumns = false;

Type t = <T>.GetType();
PropertyInfo[] pis = t.GetProperties();

foreach (PropertyInfo pi in pis)
{
    GridViewDisplayAttribute[] gvdaArray = pi.GetCustomAttributes(
        typeof(GridViewDisplayAttribute), true);

    foreach (GridViewDisplayAttribute gvda in gvdaArray)
    {
        BoundField bf = new BoundField();
        bf.DataField = pi.Name;
        bf.HeaderText = gvda.HeaderText;
    }

    gv.Columns.Add(bf);
}

gv.DataSource = IEnumerable<T>;
gv.DataBind();
0 голосов
/ 12 марта 2009

Я бы рекомендовал использовать методы расширения для добавления требуемого поведения. Единственным недостатком этого является то, что вы не можете добавить «Значения» в качестве свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...