C#. WinForms DataGridView. Заполнить колонку типа DataGridViewComboBoxColumn

516
02 августа 2017, 18:32

Добрый день, есть список типов List Users;

public enum Role {Наблюдатель, Администратор, Диктор, Инженер }    
public class User : EntityBase
{
    public string Login { get; set; }
    public string Password { get; set; }
    public Role Role { get; set; }
}

Необходимо отобразить этот список в DataGridView (WinForms), В редакторе создаю DataGridView с тремя колонками типа (DataGridViewTextBoxColumn, DataGridViewTextBoxColumn, DataGridViewComboBoxColumn). Последняя колонка типа ComboBox должна быть заполнена Role (Наблюдатель, Администратор, Диктор, Инженер).

DataGridView должна быть с возможностью добавления новой строки.

Я для теста попытался заполнять по частям (сначала для ComboBox потом для TextBox):

    var column = dgv_пользователи.Columns[2] as ataGridViewComboBoxColumn;
    if (column != null)
    {
        column.DataSource = Enum.GetValues(typeof(Role));
    }
   foreach (var user in Users)
   {
    this.dgv_пользователи.Rows.Add(new object[] { "col1", "col2"  });
   }

Значения попадают куда надо но вылазит исключение ComboBox при редактировании.

Подскажите как ПРАВИЛЬНО заполнить такой грид?

Answer 1
dgv_пользователи.AutoGenerateColumns = false;
dgv_пользователи.DataSource = Users;
var Logincol = new DataGridViewTextBoxColumn
{
    DataPropertyName = "Login",
    HeaderText = "Login",
    Name = "Login",
};
var Passwordcol = new DataGridViewTextBoxColumn
{
    DataPropertyName = "Password",
    HeaderText = "Password",
    Name = "Password",
};
dgv_пользователи.Columns.Add(Logincol);
dgv_пользователи.Columns.Add(Passwordcol);
DataGridViewComboBoxColumn Rolecol = new DataGridViewComboBoxColumn();
Rolecol.HeaderText = "Role";
Rolecol.DataSource = Enum.GetValues(typeof(Role));
Rolecol.DataPropertyName = "Role";
Rolecol.ValueMember = "Role";
Rolecol.DisplayMember = "Role";
dgv_пользователи.Columns.Add(Rolecol);
Answer 2

Получилось вот так

private void FillTable(IEnumerable<User> users )
{
    //Очистить грид.
    dgv_пользователи.Rows.Clear();
    //Заполнить ComboBox вариантами выбора.
    var column = dgv_пользователи.Columns[2] as DataGridViewComboBoxColumn;
    if (column != null)
    {
        column.DataSource = Enum.GetValues(typeof(Role)).Cast<Role>().Where(r=> (r != Role.Администратор) && (r != Role.Наблюдатель)).Select(r => r.ToString()).ToArray();
        column.DataPropertyName = "Role";
    }
    //Заполнить грид.
    for (int i= 0; i < Users.Count; i++)
    {
        var user = Users[i];
        dgv_пользователи.Rows.Add();
        dgv_пользователи["clLogin", i].Value = user.Login;
        dgv_пользователи["clPassword", i].Value = user.Password;
        DataGridViewComboBoxCell cell = dgv_пользователи["clRole", i] as DataGridViewComboBoxCell;
        if (cell != null)
        {
            cell.Value = user.Role.ToString();
        }
    }
}

Считывание после редактирования

    for (int i = 0; i < dgv_пользователи.Rows.Count - 1; ++i)
    {
        var login = (string)dgv_пользователи["clLogin", i].Value;
        var password = (string)dgv_пользователи["clPassword", i].Value;
        var role = (string)dgv_пользователи["clRole", i].Value;
        if (string.IsNullOrEmpty(login) || string.IsNullOrWhiteSpace(login))
        {
            MessageBox.Show($@"Задайте верно логин в строке: {i+1}");
            return;
        }
        if (string.IsNullOrEmpty(password) || string.IsNullOrWhiteSpace(password))
        {
            MessageBox.Show($@"Задайте верно Пароль в строке: {i + 1}");
            return;
        }
        if (string.IsNullOrEmpty(role) || string.IsNullOrWhiteSpace(role))
        {
            MessageBox.Show($@"Задайте верно Роль в строке: {i + 1}");
            return;
        }
        Users.Add(new User { Login = login, Password = password, Role = (Role)Enum.Parse(typeof(Role), role) });
    }
READ ALSO
Как установить Microsoft.ACE.OLEDB.12.0?

Как установить Microsoft.ACE.OLEDB.12.0?

На ПК стоит 2013 Office x32 и почему-то не могу использовать драйвер MicrosoftACE

395
c# сравнение изображений

c# сравнение изображений

Как можно сравнить картинки, если они имеют разные разрешения, но рисунок один и тот же?

456
Визуализация данных из БД c#

Визуализация данных из БД c#

Добрый день! У меня имеется БД, в которой храится информация о связях объектовВсе объекты имеют один тип, и каждый объект связан с другими...

295
Генерация строки в несколько потоков по интервалам

Генерация строки в несколько потоков по интервалам

Задается глобальный интервал (например, 0-1000)Есть метод write, который принимает интервал от 0 до 200, а также строку (обозначим ее S)

289