TransWikia.com

Cómo acceder a propiedades de un control creado de forma dinamica en una clase estàtica desde otro formulario

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 CheckBoxde 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?

2 Answers

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP