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!

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top