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

时间:2016-11-05 02:46:31

标签: c# winforms

我有一个带有五个只读文本框的C#窗体表单项目。 单击一个框时,特定于文本框的列表框变为可见,以便在从该列表框中选择某些内容并将其写入文本框后关闭。 如果选择了另一个文本框,我也能够使任何打开的列表框都不可见。 我需要帮助的是如果选择了除表单上的文本框之外的任何内容,例如按钮,其他文本框,菜单等,如何确保所有列表框都不可见。 我想知道是否有更有效的方法来执行此操作,而不是调用一个方法来确保所有列表框都不可见,从窗体上的每个已定义事件。 谢谢 道歉,但应该输入更多细节和过度简化的事情。 事实上,文本框激活面板,其中包含一个列表框和按钮,用于修改该列表框。 我已尝试在面板和列表框上保留事件处理程序,但是当您单击文本框以外的任何位置时似乎都不起作用。如果您在文本框中放置了离开事件,则在面板关闭时,您无法从列表框中选择任何内容。 代码如下

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

再次感谢

2 个答案:

答案 0 :(得分:0)

您可以通过将其Visible属性绑定到公共变量来控制多个Control的可见性。在Visual Studio设计器中,选择文本框并查看其属性。标有 DataBindings 的部分,以及(高级)选项。单击该按钮,您将看到可用于绑定的属性列表。选择“可见性”属性,然后选择要与之关联的现有布尔变量(作为项目数据源)。您可以使用相同的变量绑定到多个文本框的Visibile属性。当您的程序逻辑将该变量设置为True或False时,该组文本框应相应地显示/消失。

答案 1 :(得分:0)

我认为事实上我已经解决了这个问题 对于précis,两个文本框打开带有按钮和列表框的单个面板。面板中的按钮将修改列表框,当在列表框中进行选择时,它将被写入相同的只读文本框。我的问题是,如果没有选择并且用户转到表单的另一部分,我需要关闭这些面板。 我已经尝试了所有组合,解决方案似乎是在文本框点击事件打开时将焦点设置在面板上,然后让面板离开事件使面板不可见。我还需要通过表单单击事件使面板不可见。 最终代码如下:

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