Какой лучший способ для меня связать данные с DataGridView? - PullRequest
2 голосов
/ 02 февраля 2011

Я довольно новичок в C # (из Java-фона) и работаю над Form для быстрого управления различными данными (например, пользователями, доменами, компьютерами) наряду с предоставлением утилит, которые используют эти данные.

Чтобы избежать путаницы, ниже приводится краткое описание структуры данных примера:

<User>
    <Name>joe</Name>
    <Domain>europa</Domain>
</User>
<Domain>
    <Name>europa<Name>
<Domain>
<Domain>
    <Name>group</Name>
</Domain>
<Computer>
    <Name>localhost</Name>
</Computer>

В моем Form у меня есть вкладки для каждой информации, каждая из которых содержит DataGridView (содержащуюстолбец для каждого члена), чтобы обеспечить простое управление.Я использую один DataSet, который читает данные из файла XML (используя схему), когда происходит событие Form Load.После прочтения данных я устанавливаю таблицы как DataSource их соответствующих DataGridView, используя код;

userDataGridView.DataSource = dataSet.Tables["User"];
domainDataGridView.DataSource = dataSet.Tables["Domain"];
computerDataGridView.DataSource = dataSet.Tables["Computer"];

Это правильно работает для домена и компьютера DataGridViews, так как они имеют только одинтекстовые столбцы, которые сопоставлены со свойствами имени.Однако столбец «Домен» для пользователя DataGridView представляет собой поле со списком, и мне нужно, чтобы он содержал все возможные домены (например, europa, group), а также выбранный домен, привязанный к User.Domain (также к пользователю.Домен изначально выбран).

Мой главный вопрос - как мне достичь вышеуказанного, но у меня также есть некоторые дополнительные вопросы, надеюсь, кто-нибудь ответит;

  1. Я предполагаю, что изменения были внесеныDataGridView немедленно сохраняются в базовом XML-файле, когда я читаю его из выходного каталога сборки.Это правильно или требуется дополнительная конфигурация / процесс?
  2. Во время моих попыток заставить это работать, я пытался использовать DataRelation следующим образом;
    DataRelation dataRelation = new DataRelation("Domain users", 
        dataSet.Tables["Domain"].Columns["Domain"], 
        dataSet.Tables["User"].Columns["Domain"]);
    dataSet.Relations.Add(dataRelation);
    
    Как именно DataRelations работает и какой эффект они могут / могут иметь?

Если это поможет вам понять / объяснить, я использую IDE SharpDevelop для работы с этим приложением.

Заранее спасибо.

1 Ответ

2 голосов
/ 02 февраля 2011

Как вы уже узнали, DataGridView очень мощный и выполняет большую часть работы в автоматическом режиме.К сожалению, вы сталкиваетесь с проблемами, если эти значения по умолчанию не соответствуют вашим предпочтениям (например, использование ComboBox для свойства текста).

Чтобы получить DataGridViewComboBoxColumn в нужном месте, вы можете сделать это программно в своем коде или(если возможно) сделать это с дизайнером (в Visual Studio не знаю, поддерживает ли SharpDevelop это).

Использование (Visual Studio) Designer

Для этого сценария необходимо, чтобыСтруктура данных известна во время разработки, предоставляя класс, содержащий всю (или более) информацию в виде простых свойств (например, класс персонажа с именем свойства, возрастом и т. д.).Если это доступно, вы можете добавить BindingSource к своему элементу управления и щелкнуть в окне свойств на кнопке рядом со свойством DataSource .Выберите Добавить источник данных проекта , выберите Объект и выберите нужный объект.

Теперь у вас есть источник привязки, настроенный для определенного типа источника данных.Затем выберите DataGridView и измените свойство DataSource на недавно созданный источник привязки.

После этого DataGridView автоматически заполнится столбцом для каждого свойства.Теперь вы можете легко перейти к свойству Columns и изменить поведение и тип каждого столбца по своему усмотрению.

Чтобы связать ваши конкретные данные с DataGridView, просто примените вашу таблицу к источнику привязки.

Делая то же самое во время выполнения

Если у вас есть Visual Studio и вы выполнили описанные выше шаги, вы можете впоследствии легко заглянуть в файл Designer.cs и выяснить, как Visual Studio все это делал.,Там нет ничего, что вы не можете сделать также вручную.Так что если вам нужно просто сделать это.

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

Прежде чем Grid сможет отображать некоторые данные (в ComboBoxColumn), вам нужно предоставитьсписок с возможными значениями.Для этого в comboBoxColumn имеется свойство DataSource , в котором вы можете указать нужные значения.В простейшем сценарии вы просто предоставляете ICollection<string>, но вы также можете дать что-то более сложное, например List<KeyValuePair<Enum, string>>.Если это так, вы должны также установить свойства ValueMember и DisplayMember, чтобы сообщить ComboBox, какие свойства объектов следует использовать для заполнения списка.

Может быть, с учетом этой информации вам следует взглянутьв статье MSDN о DataGridViewComboBoxColumn и изучите пример.Это должно дать вам несколько дополнительных советов о том, как правильно его настроить.

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