Criar um simples DataGridView com a Lista de objetos e de seleção de coluna (C#)
-
11-12-2019 - |
Pergunta
Eu procurei em um monte de lugares e estou lutando para fazer isso, supostamente, coisa simples.Eu tenho um formulário do Windows no que eu tenho para mostrar um simples DataGridView no formulário:
| (CheckBoxColumn) | FilePath | FileState |
Agora, há um par de problemas.Os dados que eu preciso ligar para eles está em uma Lista de objetos como este:
class FileObject
{
string filePath;
string fileState;
}
//Now here's the list of these objects which I populate somehow.
List<FileObject> listFiles;
- Existe alguma maneira eficiente para o bind este diretamente para o DataGridView de modo que diferentes membros de Objeto na lista estão vinculados a colunas diferentes, e para cada um existe de seleção?
- Eu vi os exemplos de adição de seleção de coluna para um datagrid, mas nenhum deles mostrou como para adicioná-lo para o 'cabeçalho' linha bem, de modo que ele pode comportar-se como um "check all'/'desmarcar todos os' caixa.
Qualquer ajuda em como conseguir isso seria ótimo!De eu escrever aplicações simples em C#, mas nunca teve que trabalhar com datagrids etc.:(
Obrigado!
Solução
O controle DataGridView tem uma funcionalidade para gerar automaticamente colunas pode ser definida a propriedade AutoGenerateColumns.Esta propriedade assume verdade - que está colunas são gerados automaticamente.
No entanto, as colunas só são automaticamente gerados para as propriedades públicas do objeto que você ligar para a grade de campos não aparecem.
A geração automática também funciona para caixa de seleção de colunas quando há um boolean pública de propriedade sobre o objeto vinculado.
Assim, a maneira mais simples para alcançar seus dois primeiros requisitos é mudar o seu FileObject
classe a este:
public class FileObject
{
public string FilePath { get; set; }
public string FileState { get; set; }
public bool Selected { get; set; }
}
Se você não pode modificar a classe, então, melhor seria criar um objeto wrapper que contém um objeto de arquivo:
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; }
}
Em seguida, você pode criar sua lista para ligar para (um BindingList, normalmente, é melhor) fazer algo como:
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;
Há muitas maneiras de fazer o acima, mas que é uma idéia geral.
Você também pode adicionar um independente DataGridViewCheckBoxColumn
para a grade, apesar de eu achar que é mais fácil para os dependentes lista.Aqui é como se você precisa:
DataGridViewCheckBoxColumn c = new DataGridViewCheckBoxColumn();
c.Name = "Selected";
dataGridView1.Columns.Add(c);
Finalmente, para ter um "SelectedAll" opção no cabeçalho você vai precisar usar código personalizado.
O artigo no CodeProject que Umesh ligado (Caixa de verificação de Cabeçalho de Coluna para DataGridView) parece bastante fácil de implementar - criar um personalizado DataGridViewHeaderCell
substituindo a Paint
e OnMouseClick
métodos.
Outras dicas
Por favor, consulte o exemplo abaixo, que mostra exatamente o que você está procurando
http://www.codeproject.com/Articles/20165/CheckBox-Header-Column-For-DataGridView