【问题标题】:hide tabpages from another form in c#在 C# 中隐藏另一个表单的标签页
【发布时间】:2016-06-22 09:01:02
【问题描述】:

我有一个登录表单和另一个表单。当用户为 x 且密码为 y 时,我想完全显示表单,并且这部分没有问题,但是当用户 z 通过 t 登录时,我希望他无法显示 3 个标签页中的 2 个。总之,如果您能告诉我如何从另一个表单中隐藏表单的标签页,我将不胜感激。

 private void button1_Click(object sender, EventArgs e)
    {
        if (textBox1.Text == "x" && textBox2.Text == "123")
        {
            this.Hide();
            Form1 fr1 = new Form1();
            fr1.ShowDialog();

        }
        else
        {
            if (textBox1.Text == "z" && textBox2.Text == "t")
            {
                this.Hide();
                Form1 fr1 = new Form1();
               //how can I hide 2 out of 3 tabpages on form1(fr1) for this user
                fr1.ShowDialog();




            }
         }

【问题讨论】:

  • 你是否也有一个主窗体,它启动登录表单,或者是第一个登录表单,例如主要形式?
  • 你会如何在同一个表单中“隐藏”标签页??
  • 我的登录表单是启动表单,当用户名 z 和密码 t 的用户登录时,我希望他无法在 form1(fr1) 上显示 tapepage2 和 tabpage3

标签: c# forms hide tabpage


【解决方案1】:

如果您能告诉我如何从另一个表单中隐藏一个表单的标签页,我将不胜感激。

听起来您需要一种将信息从一个Form 传递到另一个的方法。这通常可以通过Form 构造函数来实现,这样在实例化时就会显示有关如何显示特定控件的相关信息。如果由于某种原因,使用构造函数方法并不理想——您可以拥有一个共享机制来存储和收集相关数据。通常,覆盖OnLoad 是进行调用以收集所述数据的不错选择。

获得所需数据后,您可以使用它来显示或隐藏标签页。我通常建议 data binding 并为 WinForms 使用 MVVM pattern

例如,您可以有一个模型来表示有关登录用户的各种详细信息,然后绑定到各种控件属性。

正如我提到的,您需要一种方法来将可见性从其构造函数传达给Form1。所以将它添加到构造函数中:

private bool _hideTwoOutOfThreeTabs;

public Form1(bool hideTwoOutOfThreeTabs = false)
{
    _hideTwoOutOfThreeTabs = hideTwoOutOfThreeTabs;
}

然后像这样覆盖OnLoad

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    if (_hideTwoOutOfThreeTabs)
    {
        foreach (var tabPage in tabControl1.TabPages.Cast<TabPage>())
        {
            // TODO: Some logical test to ensure this is the desired tab control to hide
            // if (tabPage)
            {
                tabPage.Visible = false;
            }
        }
    }
}

最后你的方法会变成这样:

private void button1_Click(object sender, EventArgs e)
{
    var textOne = textBox1.Text,
        textTwo = textBox2.Text;

    if (textOne == "x" && textTwo == "123")
    {
        Hide();
        using(var fr1 = new Form1())
        {
            fr1.ShowDialog();
        }
    }
    else if (textOne == "z" && textTwo == "t")
    {
        Hide();
        using(var fr1 = new Form1(true))
        {
            fr1.ShowDialog();
        }
    }
}

【讨论】:

  • 感谢您的回复,尽管在大多数情况下我没有明白这一点,因为我是 C# 的初学者。
  • 非常感谢您的有益回复。但是hideTwoOutOfThreeTabs不应该是真而不是假吗?我使用此代码保护覆盖 void OnLoad(EventArgs e) { base.OnLoad(e); if (_hideTwoOutOfThreeTabs) { foreach (var tabPage in tabControl1.TabPages.Cast()) { if (tabPage == tabPage2) tabPage2.Hide(); if (tabPage == tabPage3) tabPage3.Hide(); } } }
  • 当构造函数被告知它是真的时它应该是真的。在button1_Click 中查看@ 这一行(textOne == "z" &amp;&amp; textTwo == "t")。如果这是真的,那么Form1 将被实例化为true
  • 当然,我会这样做,但现在我的声誉还不够
  • 我在每个部分都有一个异常,告诉我“发生 NullRefrence Exeption,对象引用未设置为对象实例”。我不熟悉如何通过 tabControl1.TabPages.Cast() 隐藏我的 tabpage2 和 tabpage3 然后即使我使用 tabControl1.TabPages.Remove(tabPage2) 和 tabControl1.TabPages.Remove(tabPage3) 但我得到了相同的异常
猜你喜欢
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
相关资源
最近更新 更多