Tengo dos controles FlowLayoutPanel en el mismo formulario con algunos controles en ambos. Lo que O quiere es que si se hace clic en los controles FlowLayoutPanel1, quiero cambiar label1.Text y si se hace clic en los controles FlowLayoutPanel2, quiero cambiar label2.Text.

Aquí está mi código para agregar controles en ambos FlowLayoutPanel.

public void Load_DFlavours(FlowLayoutPanel FLP)
{
    try
    {
        FLP.Controls.Clear();
        using (SQLiteConnection con = new SQLiteConnection(AppSettings.ConnectionString()))
        {
            con.Open();
            using (SQLiteDataAdapter sda = new SQLiteDataAdapter("Select distinct(Flavour_Name) From Flavours Where Category_Name = 'Flavours' Order By Flavour_Name", con))
            {
                DataTable dt = new DataTable();
                sda.Fill(dt);
                foreach (DataRow dr in dt.Rows)
                {
                    RadioButton rb2 = new RadioButton();
                    rb2.AutoSize = true;
                    rb2.Font = new Font("Segoe UI Semilight", 10F);
                    rb2.Margin = new Padding(2);
                    rb2.Text = dr["Flavour_Name"].ToString();
                    rb2.UseVisualStyleBackColor = true;
                    rb2.Tag = dr["Flavour_Name"].ToString();

                    FLP.Controls.Add(rb2);

                    rb2.CheckedChanged += Rb2_CheckedChanged;
                }
            }
            con.Close();
        }
    }
    catch (SQLiteException se)
    {
        MessageBox.Show(se.Message);
    }
}

Código Clickevent:

private void Rb2_CheckedChanged(object sender, EventArgs e)
{
    RadioButton rb2 = (RadioButton)sender;
    string flavour = rb2.Tag.ToString();

    //I want to do something here if flowlayoutPanel 1 control is 
    clicked change the label1.Text and if flowlayoutPanel 2 control is 
    clicked change the label2.text

    //I have tried this
    if(rb2.Checked)
    {
        label1.text = flavour;
    }
}

¿Cómo saber en qué controles FlowLayoutPanel se hace clic?

Puedo hacer esto creando múltiples métodos, pero quiero hacer este trabajo con el mismo método.

Para más aclaraciones, vea esta imagen:

See the image

1
Usama 16 sep. 2018 a las 09:02

3 respuestas

La mejor respuesta

No tengo una computadora para verificar en este momento, pero supongo que esto debería funcionar

if (rb2.Checked)    
{
    if (rb2.Parent.Name == "flowlayoutPanel1")
    {
        label1.Text = flavour;
    }
    else if (rb2.Parent.Name == "flowlayoutPanel2")
    {
        label2.Text= flavour;
    }
}
1
user3153340 16 sep. 2018 a las 07:06

Puede usar el ControlAdded y ControlRemoved eventos del FlowLayoutPanel para suscribirse / cancelar la suscripción a un evento que cambia el texto de la etiqueta en función del control en el que se hizo clic:

private void flowLayoutPanel1_ControlAdded(object sender, ControlEventArgs e)
{
    e.Control.Click += flowLayoutPanel1_ControlClicked;
}

private void flowLayoutPanel1_ControlRemoved(object sender, ControlEventArgs e)
{
    e.Control.Click -= flowLayoutPanel1_ControlClicked;
}

private void flowLayoutPanel1_ControlClicked(object sender, EventArgs e)
{
    var control = (Control)sender;
    label1.Text = control.Text;
}

private void flowLayoutPanel2_ControlAdded(object sender, ControlEventArgs e)
{
    e.Control.Click += flowLayoutPanel2_ControlClicked;
}

private void flowLayoutPanel2_ControlRemoved(object sender, ControlEventArgs e)
{
    e.Control.Click -= flowLayoutPanel2_ControlClicked;
}

private void flowLayoutPanel2_ControlClicked(object sender, EventArgs e)
{
    var control = (Control)sender;
    label2.Text = control.Text;
}

Y, por supuesto, primero debe suscribirse a estos eventos, ya sea seleccionando el evento desde la ventana de propiedades o llamando a lo siguiente:

flowLayoutPanel1.ControlAdded += flowLayoutPanel1_ControlAdded;
flowLayoutPanel1.ControlRemoved += flowLayoutPanel1_ControlRemoved;
flowLayoutPanel2.ControlAdded += flowLayoutPanel2_ControlAdded;
flowLayoutPanel2.ControlRemoved += flowLayoutPanel2_ControlRemoved;
0
Ahmed Abdelhameed 16 sep. 2018 a las 06:59

Puede agregar más información a la propiedad Tag de RadioButton. Por ejemplo, puedes:

rb2.Tag = $"{dr["Flavour_Name"]}|{FLP.Name}";

De esta manera, puede usar string.Split() para tomar el nombre Flavour_name y FlowLayoutPanel. Pero dado que la propiedad Tag acepta el objeto, puede crear una nueva clase para contener la información.

Con este enfoque, puede usar:

RadioButton rb2 = (RadioButton)sender;
string[] splits = rb2.Tag.ToString().Split('|');
string flavour = splits[0];
string flowPanelName = splits[1];
0
Fahmi Noor Fiqri 16 sep. 2018 a las 06:40