如何使多个对象不可见与多个表单事件

本文关键字:表单 事件 何使多 对象 | 更新日期: 2023-09-27 18:16:29

我有一个c# windows窗体项目,有五个只读文本框。当一个文本框被点击时,一个特定于文本框的列表框变得可见,一旦从该列表框中选择内容并写入文本框,该列表框就会关闭。我还能够使它,使任何打开的列表框是不可见的,如果另一个文本框被选中。我需要帮助的是如何确保所有的列表框是不可见的,如果除了表单上的文本框以外的任何东西都被选中,例如按钮,其他文本框,菜单等。我想知道是否有一个更有效的方法来做到这一点,而不是调用一个方法,确保所有列表框都不可见,从每个定义的事件的形式。谢谢抱歉,但我应该输入更多的细节和过分简化的东西。实际上,文本框激活带有列表框和修改列表框的按钮的面板。我试过在面板和列表框上留下事件处理程序,但当您单击文本框以外的任何地方时,似乎都不起作用。如果在文本框上放置leave事件,则在面板关闭时无法从列表框中选择任何内容。代码如下

using System;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            panel1.Visible = false;
            panel2.Visible = false;
        }
        private void textBox2_MouseDown(object sender, MouseEventArgs e)
        {
            panel1.Visible = true;
            panel2.Visible = false;
        }
        private void textBox3_MouseDown(object sender, MouseEventArgs e)
        {
            panel1.Visible = false;
            panel2.Visible = true;
        }
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            textBox2.Text = listBox1.SelectedItem.ToString();
        }
        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            textBox3.Text = listBox2.SelectedItem.ToString();
        }
        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            panel1.Visible = false;
        }
        private void textBox3_TextChanged(object sender, EventArgs e)
        {
            panel2.Visible = false;
        }
        private void listBox1_Leave(object sender, EventArgs e)
        {
            panel1.Visible = false;
        }
        private void listBox2_Leave(object sender, EventArgs e)
        {
            panel2.Visible = false;
        }
        private void panel1_Leave(object sender, EventArgs e)
        {
            panel1.Visible = false;
        }
        private void panel2_Leave(object sender, EventArgs e)
        {
            panel2.Visible = false;
        }
    }
}

再次感谢

如何使多个对象不可见与多个表单事件

您可以通过将多个Control的Visible属性绑定到一个公共变量来控制它们的可见性。在Visual Studio设计器中,选择文本框并查看其属性。有一个标记为DataBindings的部分,在该部分下面有一个(Advanced)选项。单击它,您将看到可用于绑定的属性列表。选择Visibility属性并选择一个现有的布尔变量(作为Project数据源)与之关联。您可以使用相同的变量绑定到多个文本框的visible属性。当您的程序逻辑将该变量设置为True或False时,该文本框组应相应地出现/消失。

我想我实际上已经用一点毅力解决了这个问题要执行此操作,两个文本框打开带有按钮和列表框的单独面板。面板中的按钮将修改列表框,当在列表框中进行选择时,它将被写入相同的只读文本框。我的问题是,如果没有做出选择,并且用户转到表单的另一部分,我需要关闭这些面板。我已经尝试了所有的组合,解决方案似乎是将焦点放在面板上,当它是通过文本框单击事件打开,然后有一个面板离开事件,使面板不可见。我还需要使面板不可见与窗体单击事件。最终代码如下:

using System;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            panel1.Visible = false;
            panel2.Visible = false;
        }
        private void textBox2_MouseDown(object sender, MouseEventArgs e)
        {
            panel1.Visible = true;
            panel2.Visible = false;
            panel1.Focus();
        }
        private void textBox3_MouseDown(object sender, MouseEventArgs e)
        {
            panel1.Visible = false;
            panel2.Visible = true;
            panel2.Focus();
        }
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            textBox2.Text = listBox1.SelectedItem.ToString();
            panel1.Visible = false;
        }
        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            textBox3.Text = listBox2.SelectedItem.ToString();
            panel2.Visible = false;
        }      
        private void panel1_Leave(object sender, EventArgs e)
        {
            panel1.Visible = false;
        }
        private void panel2_Leave(object sender, EventArgs e)
        {
            panel2.Visible = false;
        }
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            panel1.Visible = false;
            panel2.Visible = false;
        }
    }
}