Creare un semplice dataGridView con l'elenco di oggetti e casella di controllo (C #)
-
11-12-2019 - |
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!
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