C # Datagridview - конвертировать TextColumn в ComboBoxColumn - PullRequest
0 голосов
/ 13 июля 2009

У меня есть приложение Windows Form, содержащее элемент управления datagridview. Сетка данных заполняется содержимым XML-файла. На данный момент все столбцы отображаются в виде столбца данных. Я хочу выбрать тот, который заполняется определенным тегом xml, и отобразить его содержимое в столбце datagridviewcomboboxcolumn вместе с двумя другими параметрами.

Пример:

<SMS>
<Number>+447931663542</Number> 
<DateTime>2009-07-12T17:00:02</DateTime> 
<Message>YES</Message> 
<FollowedUpBy>Unassigned</FollowedUpBy> 
<Outcome>Resolved</Outcome>
</SMS>

Тег OUTCOME - это столбец, который я хотел бы отобразить в виде комбинированного столбца в сетке данных. Если, например, тег пуст и не содержит данных, то я хочу ничего не отображать, но в колонке comboboxcolumn 3 возможных варианта выбора (Unresolved, Resolved, Pending). Однако, если тег содержит данные, я хочу, чтобы этот конкретный элемент отображался в комбинированном столбце, и чтобы можно было выбрать другие две опции.

Помощь в достижении этого будет принята с благодарностью!

С уважением,

EDIT: В настоящее время я использую этот код:

     colOutcome = new DataGridViewComboBoxColumn();
        colOutcome.HeaderText = "Outcome";
        colOutcome.Width = 90;
        colOutcome.Items.AddRange("Resolved", "Unresolved", "Pending");
        this.dataGridView1.Columns.Insert(1, colOutcome);
        this.dataGridView1.Columns[1].Name = "OutcomeColumn";

Этот код выше заполняет поле со списком. ПРОБЛЕМА: Когда XML-документ заполняет сетку данных, столбец результатов просто отображается как столбец текстового поля, содержащий данные между тегами результатов в файле XML. Я хочу сказать, как я могу получить представление таблицы данных, когда оно читает столбец результатов, что его необходимо изменить в столбец комбинированного списка, а затем отображать данные таким образом, наряду с другими потенциально выбираемыми параметрами в комбинированном окне ?! В настоящее время сетевое представление данных заполняется всеми столбцами в виде текстовых столбцов, содержащих данные, а также отдельным столбцом комбинированного списка, что не является тем, что я хочу. Мне нужно приложение, чтобы объединить столбец результатов и его данные с кодом выше.

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 13 июля 2009

Я не сижу перед VS, так что это может не скомпилироваться, но должно дать вам направление.

Необходимо предварительно заполнить столбец ResolvedColumn 3-4 возможными значениями во время разработки или назначить его другому источнику данных во время выполнения. Если вы выбрали подход времени разработки, просто откройте диалоговое окно DataGridView «Редактировать столбцы», найдите ResolvedColumn, перейдите в «Элементы» и добавьте свои значения («», «Unresolved», «Pending», «Resolved»). Пустое значение может помочь ComboBox для рендеринга, если есть возможность рендеринга сетки с записями SMS, которые не имеют результата.

Чтобы связать возможные параметры во время выполнения, сделайте что-то вроде этого:

private List<string> _outcomeDataSource;

private void Form1_Load(object sender, EventArgs e)
{
    _outcomeDataSource = new List<string>;
    _outcomeDataSource.Add("");
    _outcomeDataSource.Add("Unresolved");
    _outcomeDataSource.Add("Pending");
    _outcomeDataSource.Add("Resolved");

    ResolvedColumn.DataSource = _outcomeDataSource;
    ResolvedColumn.PropertyName = "Outcome";
}
0 голосов
/ 13 июля 2009

Ответ # 2 для меня, на основе обновленного вопроса.

Проблема, с которой вы сталкиваетесь, связана с функциональностью AutoGeneratedColumns DataGridView. Вам нужно будет создать столбцы вручную перед привязкой данных. Это может быть сделано во время разработки или во время выполнения. Я предпочитаю время разработки, потому что оно дает вам немного больше направления с внешним видом сетки, но в любом случае работает.

Вам необходимо отключить свойство AutoGeneratedColumns сетки:

private void Form1_Load(object sender, EventArgs e)
{
    // Define your columns at run-time here if that's what you prefer

    this.dataGridView1.AutoGeneratedColumns = false;
    this.dataGridView1.DataSource = myDataSource;
}
0 голосов
/ 13 июля 2009

Обновленный ответ

Вы можете передать документ XML в функцию, которая будет проходить через каждый узел и определять, должен ли он быть ComboBox или нет, т. Е. Если имя «Outcome».

private void CreateColumns(XmlDocument doc)
{
    foreach (...) // loop through each node in xml document
    {
         if (node.Name == "Outcome")
         {
              var items = new List<string>() { "Resolved", "Unresolved", "Pending" };
              this.dataGridView1.Columns.Add(CreateComboBoxColumn(node.Name, items));
         }
         else
         {
              this.dataGridView1.Columns.Add(String.Format("col{0}", node.Name), node.Name);
         }
    }
}

Тогда ваш код для создания столбца Outcome будет:

private DataGridViewComboBoxColumn CreateComboBoxColumn(string colHeaderText, List<string> items)
{
    var colOutcome = new DataGridViewComboBoxColumn(); 
    colOutcome.HeaderText = colHeaderText; 
    colOutcome.Width = 90; 
    colOutcome.Items.AddRange(items.ToArray());
    colOutcome.Name = String.Format("col{0}", colHeaderText);
    return colOutcome;   
}

Затем вы просто вызовете CreateColumns в событии загрузки формы и передадите свой XML. Вам нужно только создать столбцы один раз.

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

public void MyForm_Load(object sender, EventArgs e)
{
     var doc = new XmlDocument(filename);
     CreateColumns(doc);
     CreateRows(doc);
}

Надеюсь, это поможет.

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