J'essaie de renseigner un DataGridView en fonction de l'élément sélectionné dans une liste déroulante. Cette partie fonctionne.
Cependant, je dois pouvoir effacer la grille avant d'ajouter les nouvelles données d'un nouvel élément plutôt que de simplement les ajouter à la fin.
Comment effacer un DataGridView avant de lui ajouter des éléments?
Tout d'abord, annulez la source de données:
this.dataGridView.DataSource = null;
Puis effacez les lignes:
this.dataGridView.Rows.Clear();
Définissez ensuite la source de données sur la nouvelle liste:
this.dataGridView.DataSource = this.GetNewValues();
Si c'est lié à une source de données -
dataGridView.DataSource=null;
dataGridView.Rows.Clear();
Travaillé pour moi.
Vous pouvez effacer DataGridView
de cette manière
dataGridView1.Rows.Clear();
dataGridView1.Refresh();
Si c'est databound
alors essayez ceci
dataGridView1.Rows.Clear() // If dgv is bound to datatable
dataGridView1.DataBind();
SI vous souhaitez effacer non seulement les données, mais également les listes déroulantes, les cases à cocher, essayez
dataGridView.Columns.Clear();
DataGrid.DataSource = null;
DataGrid.DataBind();
Vous pouvez affecter la source de données à la valeur NULL de votre grille de données, puis la lier à nouveau.
dg.DataSource = null;
dg.DataBind();
Vous pourriez prendre cette instruction suivante et faire le travail avec un manque de performance. Si vous voulez voir l'effet de cela, mettez l'une des 2 instructions suivantes (Techniquement similaires) où vous devez effacer le DataGridView dans un bloc {} catch (...) {} et attendez ce qui se produit.
while (dataGridView1.Rows.Count > 1)
{
dataGridView1.Rows.RemoveAt(0);
}
foreach (object _Cols in dataGridView1.Columns)
{
dataGridView1.Columns.RemoveAt(0);
}
Vous améliorez cette tâche mais cela ne suffit pas, il y a un problème pour réinitialiser un DataGridView, à cause des colonnes restant dans l'objet DataGridView. Enfin, je suggère que la meilleure façon de mettre en œuvre ma pratique personnelle consiste à traiter ce gridView comme un fichier avec des lignes, des colonnes: une collection d'enregistrements basée sur la correspondance entre les lignes et les colonnes. Si vous pouvez vous améliorer, alors choisissez vous-même a) ou b): pour chaque moment.
//(a): With foreach
foreach (object _Cols in dataGridView1.Columns)
{
dataGridView1.Columns.RemoveAt(0);
}
foreach(object _row in dataGridView1.Rows){
dataGridView1.Rows.RemoveAt(0);
}
//(b): With foreach
while (dataGridView1.Rows.Count > 1)
{
dataGridView1.Rows.RemoveAt(0);
}
while (dataGridView1.Columns.Count > 0)
{
dataGridView1.Columns.RemoveAt(0);
}
Bien, comme une recommandation Jamais de votre vie supprimer les colonnes en premier, l'ordre est avant les lignes après les colonnes, parce que logiquement les colonnes ont été créées en premier et ensuite les lignes.Il serait une pénalité en termes d'analyse correcte.
foreach (object _Cols in dataGridView1.Columns)
{
dataGridView1.Columns.RemoveAt(0);
}
foreach (object _row in dataGridView1.Rows)
{
dataGridView1.Rows.RemoveAt(0);
}
while (dataGridView1.Rows.Count > 1)
{
dataGridView1.Rows.RemoveAt(0);
}
while (dataGridView1.Columns.Count > 0)
{
dataGridView1.Columns.RemoveAt(0);
}
Ensuite, placez-le dans une fonction ou une méthode.
private void ClearDataGridViewLoopWhile()
{
while (dataGridView1.Rows.Count > 1)
{
dataGridView1.Rows.RemoveAt(0);
}
while (dataGridView1.Columns.Count > 0)
{
dataGridView1.Columns.RemoveAt(0);
}
}
private void ClearDataGridViewForEach()
{
foreach (object _Cols in dataGridView1.Columns)
{
dataGridView1.Columns.RemoveAt(0);
}
foreach (object _row in dataGridView1.Rows)
{
dataGridView1.Rows.RemoveAt(0);
}
}
Enfin, appelez votre nouvelle fonction ClearDataGridViewLoopWhile (); ou ClearDataGridViewForEach (); où vous devez l’utiliser, mais cela est recommandé lorsque vous effectuez des requêtes et que vous modifiez plusieurs tables qui se chargeront avec différents noms d’en-tête dans grieView. Mais si vous voulez conserver les en-têtes ici, une solution est proposée.
private void ClearGrid()
{
if(this.InvokeRequired) this.Invoke(new Action(this.ClearGrid));
this.dataGridView.DataSource = null;
this.dataGridView.Rows.Clear();
this.dataGridView.Refresh();
}
Si vous souhaitez effacer tous les en-têtes ainsi que les données, par exemple si vous basculez entre 2 bases de données totalement différentes avec des champs différents, donc des colonnes et des en-têtes de colonne différents, les éléments suivants ont fonctionné. Sinon, lorsque vous basculez, les colonnes/champs des deux bases de données apparaissent dans la grille.
dataTable.Dispose();//get rid of existing datatable
dataTable = new DataTable();//create new datatable
datagrid.DataSource = dataTable;//clears out the datagrid with empty datatable
//datagrid.Refresh(); This does not seem to be neccesary
dataadapter.Fill(dataTable); //assumming you set the adapter with new data
datagrid.DataSource = dataTable;
dataGridView1.Rows.Clear();
dataGridView1.Refresh();
datatable.Clear();
dataGridView1.DataSource = datatable;
Pour avoir une grille de données, vous devez avoir une méthode qui formate votre grille de données. Si vous voulez effacer la grille de données, rappelez simplement la méthode.
Voici ma méthode:
public string[] dgv_Headers = new string[] { "Id","Hotel", "Lunch", "Dinner", "Excursions", "Guide", "Bus" }; // This defined at Public partial class
private void SetDgvHeader()
{
dgv.Rows.Clear();
dgv.ColumnCount = 7;
dgv.RowHeadersVisible = false;
int Nbr = int.Parse(daysBox.Text); // in my method it's the textbox where i keep the number of rows I have to use
dgv.Rows.Add(Nbr);
for(int i =0; i<Nbr;++i)
dgv.Rows[i].Height = 20;
for (int i = 0; i < dgv_Headers.Length; ++i)
{
if(i==0)
dgv.Columns[i].Visible = false; // I need an invisible cells if you don't need you can skip it
else
dgv.Columns[i].Width = 78;
dgv.Columns[i].HeaderText = dgv_Headers[i];
}
dgv.Height = (Nbr* dgv.Rows[0].Height) + 35;
dgv.AllowUserToAddRows = false;
}
dgv est le nom de DataGridView
actualise le datagridview et actualise le datatable
dataGridView1.Refresh();
datatable.Clear();