0

我非常新,所以我可能完全偏离了我正在尝试做的事情。

我真的不知道怎么问这个问题,我的英语有点生硬。

但我有 2 个文件,其中一个包含以下内容:

frmMain.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {
            Class1 cls = new Class1();
            cls.Visibility();
        }
    }
}

另一个包含这个的文件:

Class1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
    public partial class Class1
    {
        public void Visibility()
        {
            frmMain c = new frmMain();
            c.label1.Visible = false;
        }
    }
}

我想要得到的是,当我运行程序并单击 label1 时,我希望它消失。但事实并非如此。我没有收到任何错误或任何东西。任何帮助表示赞赏:)。

提前致谢。

4

6 回答 6

1

第一:你为什么试图通过使用另一个类来让你的主窗体上的标签消失?

我建议如下:

private void label1_Click(object sender, EventArgs e)
{
    label1.Visible = false;
}

我认为您的代码不起作用的原因是您在函数内部Visibility()创建Class1了一个新的 frmMain,并且在该 frmMain 上您将visiblelabel1 的属性设置为 false。所以你实际上是在使用不同的形式。

于 2013-11-14T09:56:33.910 回答
0

您正在实例化一个新的、单独的表单。这意味着标签被隐藏了......但是在您创建的隐藏表单上。

您需要将当前表单实例传递给您的其他类:

public void Visibility(frmMain mainForm) {
    mainForm.label1.Visible = false;
}

然后像这样调用它:

new Class1().Visibility(this);
于 2013-11-14T09:54:43.113 回答
0

您正在做的是创建窗口的第二个实例(这对您来说可能并不明显,因为您没有显示它)。然后,您将标签隐藏在第二个窗口中。可能不是你一开始想要的。

您需要做的是将原始表单的引用传递给您正在调用的方法,或者(取决于您想要做什么)对您需要隐藏的控件的引用:

在第一类:

public void Visibility(Control controlToHide)
{
    controlToHide.Visible = false;
}

在 frmMain.cs

new Class1.Visibility(this.label1)

更多评论:

  • 命名:不要使用 Class1、label1 之类的名称;我很欣赏这可能只是“玩弄”类型的代码,但是当您稍后尝试返回您的代码(或让其他人看看)时,这些名称完全不可读
  • 命名 2:尝试命名您的方法以描述它们将做什么 -HideControlHideLabelVisiblity
  • 您可能想阅读一些基本的 C# 教程来了解引用、实例、参数等。

除此之外,快乐的 C#-ing :)

于 2013-11-14T09:55:04.270 回答
0

不想Class1知道frmMain。把它改成这样:

public class Class1
{
    public bool GetVisibility()
    {
        return false;
    }
}

从你的表格中,这样称呼它:

private void label1_Click(object sender, EventArgs e)
{
    Class1 cls = new Class1();

    this.Label1.Visible = cls.GetVisibility();
}

您当前的实现Class1初始化一个new frmMain,隐藏该表单Label1,对该实例不做任何事情(例如,它不Show()它)然后返回,不影响已经实例化和显示的frmMain的实例(您实例化的实例Class1)。

您可以通过将标签甚至表单传递给 来更改它Class1,但这只是糟糕的设计。

于 2013-11-14T09:55:34.380 回答
0

您正在设置另一个表单标签的可见性(一个未显示的表单。

Visibility 方法中的这行代码创建了一个新对象

frmMain c = new frmMain();

它与显示的表单类型相同,但它是不同的对象,不会显示。如果在上面插入一行

c.Show();

您应该会看到新创建的表单,并且还会看到标签消失了

但是,有一个直接解决您的问题的方法。将事件处理程序更改为此

private void label1_Click(object sender, EventArgs e)
{
    ((Label)sender).Visible = false;
}

sender 对象是被单击的控件,并且由于事件附加到它自己的标签。您需要做的就是将sendera 转换为 a 的类型,Label然后您就可以访问 visible 属性。或者,您可以这样做:

private void label1_Click(object sender, EventArgs e)
{
    this.label1.Visible = false;
}

它使用当前对象(aka this)并从该对象获取标签。

于 2013-11-14T09:53:23.833 回答
0

您可以通过以下方式更改代码:

public partial class FrmMain : Form
{
    public frmMain()
    {
        InitializeComponent();
    }

    private void label1_Click(object sender, EventArgs e)
    {
        new Class1().Visibility(this);
    }

    public void Go()
    {
        this.label1.Visible = false;
    }
}

然后

public partial class Class1
{
    public void Visibility(FrmMain form)
    {
       form.Go();            
    }
}
于 2013-11-14T09:54:13.360 回答