Создайте простой DataGridView со списком объектов и столбцом флажка (C#).
-
11-12-2019 - |
Вопрос
Я просмотрел много мест и изо всех сил пытаюсь сделать эту, казалось бы, простую вещь.У меня есть форма Windows, в которой я должен показать простой DataGridView в этой форме:
| (CheckboxColumn) | FilePath | FileState |
Теперь есть пара проблем.Данные, которые мне нужно связать с ними, находятся в списке таких объектов:
class FileObject
{
string filePath;
string fileState;
}
//Now here's the list of these objects which I populate somehow.
List<FileObject> listFiles;
- Есть ли какой -либо эффективный способ связать это непосредственно с DataGridView, чтобы разные члены объекта в списке были связаны с разными столбцами, а для каждого есть флажок?
- Я увидел примеры добавления столбца флажки в DataGrid, но ни один из них не показал, как добавить его в строку заголовка, так что он может вести себя как коробку «проверить все»/«снять все».
Любая помощь в том, как этого добиться, была бы замечательной!Я пишу простые приложения на C#, но мне никогда не приходилось работать с сетками данных и т. д.:(
Спасибо!
Решение
Элемент управления DataGridView имеет функцию автоматического создания столбцов, которые можно задать с помощью свойства AutoGenerateColumns.По умолчанию это свойство имеет значение true, то есть столбцы по умолчанию генерируются автоматически.
Однако столбцы автоматически генерируются только для общедоступных свойств объекта, который вы привязываете к сетке — поля не отображаются.
Автоматическое создание также работает для столбцов флажков, если у привязанного объекта есть общедоступное логическое свойство.
Поэтому самый простой способ выполнить первые два требования — изменить FileObject
класс к этому:
public class FileObject
{
public string FilePath { get; set; }
public string FileState { get; set; }
public bool Selected { get; set; }
}
Если вы не можете изменить этот класс, то следующим лучшим вариантом будет создание объекта-оболочки, содержащего файловый объект:
public class FileObjectWrapper
{
private FileObject fileObject_;
FileObjectWrapper()
{
fileObject_ = new FileObject();
}
FileObjectWrapper(FileObject fo)
{
fileObject_ = fo;
}
public string FilePath
{
get { return fileObject_.filePath; }
set { fileObject_.filePath = value; }
}
public string FileState
{
get { return fileObject_.fileState; }
set { fileObject_.fileState= value; }
}
public bool Selected { get; set; }
}
Затем вы можете создать свой список для привязки (обычно лучше всего использовать BindingList), выполнив что-то вроде:
var fowList = new BindingList<FileObjectWrapper>();
foreach (FileObject fo in // here you have your list of file objects! )
{
fowList.Add(new FileObjectWrapper(fo));
}
dataGridView1.DataSource = fowList;
Есть много способов сделать вышеперечисленное, но это общая идея.
Вы также можете добавить несвязанный DataGridViewCheckBoxColumn
в сетку, хотя мне легче иметь связанный список.Вот как это сделать, если вам нужно:
DataGridViewCheckBoxColumn c = new DataGridViewCheckBoxColumn();
c.Name = "Selected";
dataGridView1.Columns.Add(c);
Наконец, чтобы иметь опцию «SelectedAll» в заголовке, вам нужно будет использовать собственный код.
Статья о CodeProject, на которую ссылается Умеш (Столбец заголовка CheckBox для DataGridView) выглядит довольно легко реализовать — они создают собственный DataGridViewHeaderCell
перекрывая Paint
и OnMouseClick
методы.
Другие советы
Пожалуйста, обратитесь к примеру ниже, показывая именно то, что вы ищете
http://www.codeproject.com/articles/20165 / CheckBox-Header-Column-For-DataGridView