Создайте простой DataGridView со списком объектов и столбцом флажка (C#).

StackOverflow https://stackoverflow.com//questions/11663100

Вопрос

Я просмотрел много мест и изо всех сил пытаюсь сделать эту, казалось бы, простую вещь.У меня есть форма 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top