Как изменить размер столбцов DataGrid, привязанных к List <T>, а не к DataSet? - PullRequest
0 голосов
/ 21 апреля 2009

Я пытаюсь использовать элемент управления System.Windows.Forms.DataGrid в моем проекте на основе SDK для Compact Framework 3.5 Window Mobile Professional 6, чтобы показать некоторые свойства объектов типа Something, привязав DataGrid к экземпляру List<SomethingWrapper>, например это:

public class SomethingWrapper {
   private Something data;
   public SomethingWrapper(Something data) { this.data = data; }
   public string Column1 { get { /* string from this.data */ } }
   public string Column2 { get { /* string from this.data */ } }
}

public class SomethingList : List<SomethingWrapper> {
   public SomethingList(IEnumerable<Something> items) {
      foreach (var item in items) Add(new SomethingWrapper(item));
      Sort((a, b) => a.Column2.CompareTo(b.Column2);
   }
}

/* ... */

IEnumerable<Something> dataToShow = /* assume this is filled correctly */
SomethingDataGrid.DataSource = new SomethingList(dataToShow);

Кажется, это работает нормально: правильные данные отображаются в сетке с двумя столбцами с именами Column1 и Column2 и сортируются во втором столбце. Я хочу, чтобы это было только для чтения этих данных, так что все в порядке.

Однако я хотел бы установить ширину столбцов и не могу заставить это работать ...

Попытка очевидного: создание TableStyle, создание экземпляра стиля столбца в текстовом поле для каждого столбца, добавление его к TableStyle и установка SomethingDataGrid.TableStyle к результирующему стилю таблицы. (Это из памяти, или я бы также показал точный код, который я использую. При необходимости я могу добавить это к вопросу где-то позже сегодня.)

Ничего не меняется, однако. Я подозреваю, что это как-то связано с MappingName на объекте TableStyle; все примеры, которые я смог найти вчера вечером, похоже, связаны с привязкой данных DataSet к DataGrid и установкой MappingName к правильному имени таблицы в DataSet. В противном случае стиль таблицы не будет соответствовать вашим ожиданиям. Именно такое поведение я наблюдаю.

Вопрос: ищу ли я правильное место для решения своей проблемы, и если да, то что мне нужно установить TableStyle.MappingName при привязке к List<T>, чтобы показать свойства T ...

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

Ответы [ 2 ]

2 голосов
/ 21 апреля 2009

Ах, в конце концов, выглядело не очень хорошо: Дублированный вопрос найден . Постараюсь извлечь из BindingList<T> и / или использовать источник привязки, чтобы я мог начать вызывать BindingSource.GetListName(null), чтобы получить MappingName. Надеюсь, это поможет. Если нет, я вернусь ...

1 голос
/ 22 апреля 2009

Вы можете сделать это, создав DataGridTableStyle

Вот метод расширения, который я использую:

public static void SetColumnStyles<T>(this DataGrid ctrl, T data, params ColumnStyle[] column) where T: class 
    {
        var ts = new DataGridTableStyle();
        ts.MappingName = data.GetType().Name;

        foreach (var style in column)
        {
            ts.GridColumnStyles.AddColumn(style.Header, style.Column, style.Width);
        }

        ctrl.TableStyles.Clear();
        ctrl.TableStyles.Add(ts);
    }

Тогда я называю это так:

    var newList = queriableData.ToList();
    ProductEdit.DataSource = newList;
    ProductEdit.SetColumnStyles(newList, new[]
                                      {
                                          new ColumnStyle("Name", 200),
                                          new ColumnStyle("Manufacturer", 100),
                                          new ColumnStyle("Size", 20)
                                      });

, где newList - это общий список объектов.

...