Добрый день, есть список типов 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 при редактировании.
Подскажите как ПРАВИЛЬНО заполнить такой грид?
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);
Получилось вот так
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) });
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
На ПК стоит 2013 Office x32 и почему-то не могу использовать драйвер MicrosoftACE
Как можно сравнить картинки, если они имеют разные разрешения, но рисунок один и тот же?
Добрый день! У меня имеется БД, в которой храится информация о связях объектовВсе объекты имеют один тип, и каждый объект связан с другими...
Задается глобальный интервал (например, 0-1000)Есть метод write, который принимает интервал от 0 до 200, а также строку (обозначим ее S)