【问题标题】:How to handle click event of two FlowLayoutPanel with some dynamically created controls?如何使用一些动态创建的控件来处理两个 FlowLayoutPanel 的点击事件?
【发布时间】:2018-09-16 15:06:59
【问题描述】:

我在同一个表单上有两个FlowLayoutPanel 控件,它们都有一些控件。 O想要的是,如果单击FlowLayoutPanel1控件,我想更改label1.Text,如果单击FlowLayoutPanel2控件,我想更改label2.Text

这是我在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);
    }
}

点击事件代码:

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;
    }
}

如何知道点击了哪些FlowLayoutPanel控件?

我可以通过创建多个方法来做到这一点,但我想在同一个方法上完成这项工作。

有关更多说明,请参阅此图片:

【问题讨论】:

    标签: c# winforms flowlayoutpanel


    【解决方案1】:

    现在没有要检查的计算机,但我认为这应该可以工作

    if (rb2.Checked)    
    {
        if (rb2.Parent.Name == "flowlayoutPanel1")
        {
            label1.Text = flavour;
        }
        else if (rb2.Parent.Name == "flowlayoutPanel2")
        {
            label2.Text= flavour;
        }
    }
    

    【讨论】:

    • rb2.checked 在哪里没有任何反应?
    • 如果您愿意,您可以将&& rb2.Checked 添加到ifelse 语句中,但不应进行任何更改,因为它们是单选按钮,并且它们不能是“ unselected” 被用户选中,因此将始终被选中。您检查过 FLP 名称吗?
    • 对不起,我看错了你的评论。我提供给您的代码应该在if (rb2.Checked) 语句中。我的错。
    【解决方案2】:

    您可以向RadioButtonTag 属性添加更多信息。例如,您可以:

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

    这样,您可以使用string.Split() 来获取Flavour_nameFlowLayoutPanel 名称。但由于Tag 属性接受对象,您可以创建新类来保存信息。

    使用这种方法,您可以使用:

    RadioButton rb2 = (RadioButton)sender;
    string[] splits = rb2.Tag.ToString().Split('|');
    string flavour = splits[0];
    string flowPanelName = splits[1];
    

    【讨论】:

    • 您必须在更改文本之前检查flowPanelName
    【解决方案3】:

    您可以使用 FlowLayoutPanel 的 ControlAddedControlRemoved 事件来订阅/取消订阅根据单击的控件更改标签文本的事件:

    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;
    }
    

    当然,您需要先订阅这些事件,方法是从属性窗口中选择事件,或者调用以下命令:

    flowLayoutPanel1.ControlAdded += flowLayoutPanel1_ControlAdded;
    flowLayoutPanel1.ControlRemoved += flowLayoutPanel1_ControlRemoved;
    flowLayoutPanel2.ControlAdded += flowLayoutPanel2_ControlAdded;
    flowLayoutPanel2.ControlRemoved += flowLayoutPanel2_ControlRemoved;
    

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多