2016-11-05 2 views
1

У меня есть DataTable, который содержит столбцы различных типов данных - int, string, bool, Enum (как Severity в примере ниже):Показать ComboBox для BOOL и Enum столбцов в DataGridView

hostTable = new DataTable(); 
hostTable.Columns.Add("Suspended", typeof(bool)); 
hostTable.Columns.Add("Succ Tests", typeof(int)); 
hostTable.Columns.Add("Unsucc Tests", typeof(int)); 
hostTable.Columns.Add("System Name", typeof(string)); 
hostTable.Columns.Add("System IP", typeof(string)); 
hostTable.Columns.Add("Criticality", typeof(Severity)); 
hostTable.Columns.Add("Alert Email To", typeof(string)); 
hostTable.Columns.Add("Alert Email Cc", typeof(string)); 
hostTable.Columns.Add("Likely Impact", typeof(string)); 
hostTable.Columns.Add("Likely Causes", typeof(string)); 
hostTable.Columns.Add("Escalation", typeof(string)); 

hostTable.Rows.Add((bool)hd.IsSuspended, (int)hd.SuccTests, (int)hd.UnSuccTests, 
    hd.SystemName, hd.SystemIp, (Severity)hd.Criticality, hd.AlertEmailToAddress, 
    hd.AlertEmailCcAddress, hd.LikelyImpact, hd.LikelyCauses, hd.EscalationInstructions); 

dgvHostTable.DataSource = hostTable; 

Когда я связываю это к DataGridView, как я могу сделать столбцы показать с этой настройки:

  • BOOL колонки → ComboBox с истинными/ложными вариантами
  • Enum колонны → ComboBox со списком перечислений
  • строковых столбцы → Так же, как для редактирования текстового поля
+0

Если вы используете DataGridView, вы автоматически получаете флажок. – jdweng

+0

Вы должны добавить столбец DataGridViewComboBox' для этих столбцов самостоятельно. Вы можете создать метод для этого. –

ответ

1

Вы должны добавить DataGridViewComboBox колонки для этих столбцов самостоятельно. Вы можете создать метод повторного использования, чтобы сделать это для вас.

В коде ниже, я проверил все столбцы управления DataGridView и для каждого столбца, если он был связан с bool собственности или Enum собственности, я использовал DataGridViewComboBoxCOlumn вместо того, чтобы:

public void UseComboBoxForEnumsAndBools(DataGridView g) 
{ 
    g.Columns.Cast<DataGridViewColumn>() 
    .Where(x => x.ValueType == typeof(bool) || x.ValueType.IsEnum) 
    .ToList().ForEach(x => 
    { 
     var index = x.Index; 
     this.dataGridView1.Columns.RemoveAt(index); 
     var c = new DataGridViewComboBoxColumn(); 
     c.ValueType = x.ValueType; 
     c.ValueMember = "Value"; 
     c.DisplayMember = "Name"; 
     c.DataPropertyName = x.DataPropertyName; 
     c.HeaderText = x.HeaderText; 
     c.Name = x.Name; 
     if (x.ValueType == typeof(bool)) 
     { 
      c.DataSource = new List<bool>() { true, false }.Select(b => new 
      { 
       Value = b, 
       Name = b ? "True" : "False" /*or simply b.ToString() or any logic*/ 
      }).ToList(); 
     } 
     else if (x.ValueType.IsEnum) 
     { 
      c.DataSource = Enum.GetValues(x.ValueType).Cast<object>().Select(v => new 
      { 
       Value = (int)v, 
       Name = Enum.GetName(x.ValueType, v) /* or any other logic to get text */ 
      }).ToList(); 
     } 

     g.Columns.Insert(index, c); 
    }); 
} 

Пример

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

public enum MyEnum { First, Second, Third } 
private void Form1_Load(object sender, EventArgs e) 
{ 
    var dt = new DataTable(); 
    dt.Columns.Add("C1", typeof(bool)); 
    dt.Columns.Add("C2", typeof(MyEnum)); 
    dt.Columns.Add("C3", typeof(string)); 
    dt.Rows.Add(true, MyEnum.First, "string"); 
    this.dataGridView1.DataSource = dt; 
    UseComboBoxForEnumsAndBools(this.dataGridView1); 
} 

enter image description here

+0

Кажется, сообщение отвечает на ваш вопрос. Дайте мне знать, если у вас возникли проблемы с применением решения или если вы сочтете это полезным :) –

Смежные вопросы