Stack Overflow en español Asked on November 29, 2021
necesitaba crear una columna de CheckBox
en un DataGridView
y en la cabecera de esta un CheckBox
de seleccionar todos.
Lo hice en forma de métodos en una clase estática a los que le paso el DataGridView
y me lo montan.
Los metodos en cuestion son:
//Añade la columna de checkboxs en la primera posicion.
public static void AddCheckColumn(DataGridView dgv)
{
DataGridViewCheckBoxColumn chkCol = new DataGridViewCheckBoxColumn();
chkCol.Name = "colCheck";
chkCol.HeaderText = "";
chkCol.Width = 30;
chkCol.ReadOnly = false;
dgv.Columns.Insert(0,chkCol);
}
//Crea un objeto CheckBox, lo asocia a la colección de controles del DataGridView y lo mueve al lugar del header.
public static void CheckHeader(DataGridView dgv, EventHandler HeaderCheck_Clicked)
{
CheckBox chkHead = new CheckBox();
Point headerCellLocation = dgv.GetCellDisplayRectangle(0, -1, true).Location;
int cellWidth = dgv.GetCellDisplayRectangle(0, -1,true).Width;
int cellHeight = dgv.GetCellDisplayRectangle(0, -1, true).Height;
chkHead.Location = new Point(headerCellLocation.X + 8, headerCellLocation.Y + 2);
chkHead.BackColor = Color.White;
chkHead.FlatStyle = FlatStyle.Standard;
chkHead.BackColor = Color.Transparent;
chkHead.Size = new Size(18, 18);
chkHead.Click += HeaderCheck_Clicked;
dgv.Controls.Add(chkHead);
}
El problema lo tengo en el evento click
del CheckBox
del header
, que como veis, se lo paso al método como parámetro a través de un delegado para poder llamarlo desde el formulario principal:
private void frmOfertes_Load(object sender, EventArgs e)
{
string queryCmbFam = "SELECT codigo,nombre from " + DB.SQLDatabase("GESTION", "familias");
cmbSubfam.Enabled = false;
funcions.EmplenaCombo(queryCmbFam, cmbFam);
funcions.AddCheckColumn(ewgrid1);
funcions.FiltreGridArticles(cmbFam, cmbSubfam, ewgrid1);
funcions.CheckHeader(ewgrid1, HeaderCheck_Clicked);
Dictionary<string, int> ampleCamps = new Dictionary<string, int>()
{
{"codigo",80 },
{"nombre",200 }
};
funcions.ColumnSize(ampleCamps, ewgrid1);
}
private void HeaderCheck_Clicked(object sender, EventArgs e)
{
ewgrid1.EndEdit();
foreach(DataGridViewRow row in ewgrid1.Rows)
{
DataGridViewCheckBoxCell chkbox = (row.Cells["colCheck"] as DataGridViewCheckBoxCell);
chkbox.Value = chkHead.Checked;
}
}
Lo que hago en este evento, es igualar los CheckBox
de la columna del DataGridView
al estado del CheckBox
del header
y aquí viene el problema, no sé cómo hacerlo, ya que este checkbox
lo creo dinámicamente en el método CheckHeader()
de la clase estática, a alguien se le ocurre como puedo hacerlo?
private CheckBox chkHead;
public static void CheckHeader(DataGridView dgv, EventHandler HeaderCheck_Clicked)
{
chkHead = new CheckBox();
Point headerCellLocation = dgv.GetCellDisplayRectangle(0, -1, true).Location;
int cellWidth = dgv.GetCellDisplayRectangle(0, -1,true).Width;
int cellHeight = dgv.GetCellDisplayRectangle(0, -1, true).Height;
chkHead.Location = new Point(headerCellLocation.X + 8, headerCellLocation.Y + 2);
chkHead.BackColor = Color.White;
chkHead.FlatStyle = FlatStyle.Standard;
chkHead.BackColor = Color.Transparent;
chkHead.Size = new Size(18, 18);
chkHead.Click += HeaderCheck_Clicked;
dgv.Controls.Add(chkHead);
}
Answered by Luis Eusebio Larota Ccoa on November 29, 2021
Podrias usar el sender
para acceder al checkbox
del header que lanza el evento
private void HeaderCheck_Clicked(object sender, EventArgs e)
{
var chkHead = (CheckBox)sender;
foreach(var row in ewgrid1.Rows)
{
var chkbox = (DataGridViewCheckBoxCell)row.Cells["colCheck"];
chkbox.Value = chkHead.Checked;
}
}
Answered by Leandro Tuttini on November 29, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP