Domanda

Ho guardato un sacco di posti e sto lottando per fare questa cosa apparentemente semplice.Ho una forma di Windows su cui devo mostrare un semplice dataGridView in questo modulo:

|(CheckBoxColumn) |FilePath |.Filestate |

Ora, ci sono un paio di problemi.I dati che ho bisogno di legarsi sono in un elenco di oggetti come questo:

    class FileObject
    {
        string filePath;
        string fileState;
    }

    //Now here's the list of these objects which I populate somehow. 
    List<FileObject> listFiles;
.

    .
  • C'è qualche modo efficiente per legarlo direttamente alla DataGridView in modo che diversi membri di oggetti nella lista siano destinati a Colonne diverse e per ognuna c'è la casella di controllo?
  • Ho visto gli esempi di aggiunta di colonna di controllo a un datagrid, ma nessuno di loro ha mostrato come Per aggiungerlo anche alla riga "intestazione", in modo che possa comportarsi come un "controlla tutto" / 'deselezionare la casella.

    Qualsiasi aiuto in Come raggiungere questo sarebbe fantastico!Scrivo semplici applicazioni in c # ma non ho mai dovuto lavorare con datagrids ecc.: (

    Grazie!

È stato utile?

Soluzione

Il controllo DataGridView ha una funzione per generare automaticamente colonne che possono essere impostate dalla proprietà AutogenerateColumns. Questa proprietà predefinita su TRUE - cioè le colonne sono generate automaticamente predefinite.

Tuttavia, le colonne vengono generate automaticamente automaticamente per le proprietà pubbliche dell'oggetto che si legano alla griglia - i campi non vengono visualizzati.

Auto Generation funziona anche per le colonne della casella di controllo quando c'è una proprietà booleana pubblica sull'oggetto legato.

Quindi il modo più semplice per ottenere i tuoi primi due requisiti è cambiare la classe FileObject a questo:

public class FileObject
{
    public string FilePath { get; set; }
    public string FileState { get; set; }
    public bool Selected { get; set; }
}
.

Se non è possibile modificare quella classe, quindi il prossimo migliore sarebbe la creazione di un oggetto wrapper che contiene un oggetto file:

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; }
}
.

È quindi possibile creare il tuo elenco per legare (un bindinglist di solito è il migliore) facendo qualcosa come:

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;    
.

Ci sono molti modi per fare quanto sopra, ma questa è un'idea generale.


.

Puoi anche aggiungere un DataGridViewCheckBoxColumn non appropriato alla griglia, anche se trovo più facile avere nell'elenco Legato. Ecco come se hai bisogno di:

DataGridViewCheckBoxColumn c = new DataGridViewCheckBoxColumn();
c.Name = "Selected";
dataGridView1.Columns.Add(c);
.


.

Infine, per avere un'opzione "selezionatrice" nell'intestazione, è necessario utilizzare il codice personalizzato.

L'articolo su CodeProject che Umesh collegato a ( Colonna dell'intestazione della casella di controllo Per DataGridView ) sembra abbastanza facile da implementare - creano un DataGridViewHeaderCell personalizzato che sovrascrivono i metodi Paint e OnMouseClick.

Altri suggerimenti

Si prega di fare riferimento all'esempio seguente, mostrando esattamente quello che stai cercando

http://www.codeproject.com/articles/20165 / Checkbox-Header-Column-For-DataGridView

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top