从不同的文件调用方法/类

时间:2013-11-14 09:47:41

标签: c#

我非常新,所以我可能完全偏离了我想要做的事情。

我真的不知道如何提问,我的英语有点不稳定。

但我有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时,我希望它消失。 但事实并非如此。我没有任何错误或任何错误。 任何帮助表示赞赏:)。

提前致谢。

6 个答案:

答案 0 :(得分:1)

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

我建议如下:

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

我认为您的代码无法正常工作的原因是Visibility()的{​​{1}}函数内部正在创建一个新的frmMain,并且在该frmMain上您正在设置Class1属性label1为false。所以你实际上是在使用不同的形式。

答案 1 :(得分:0)

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

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

frmMain c = new frmMain();

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

之后插入一行
c.Show();

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

然而,您可以直接解决问题。将事件处理程序更改为此

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

发件人对象是被点击的控件,因为事件附加到自己的标签上。您需要做的就是将sender转换为Label的类型,然后您可以访问visible属性。或者你可以这样做:

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

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

答案 2 :(得分: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();            
    }
}

答案 3 :(得分:0)

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

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

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

然后这样称呼:

new Class1().Visibility(this);

答案 4 :(得分:0)

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

您需要做的是将对原始表单的引用传递给您正在调用的方法,或者(根据您的意图)对您需要隐藏的控件的引用:

Class1中的

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

new Class1.Visibility(this.label1)

更多评论:

  • 命名:不要使用Class1,label1等名称;我很欣赏这可能 只是'玩弄'一种代码,但这样的名字是完全的 当你试图稍后回到你的代码时(或获得 别人看看)
  • 命名2:尝试命名您的方法以描述他们将要执行的操作 - HideControl,或HideLabelVisiblity
  • 更好
  • 您可能需要阅读一些基本的C#教程来了解参考,实例,参数等。

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

答案 5 :(得分: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实施初始化 frmMain,隐藏该格式为Label1,不对该实例执行任何操作(例如,它不< em> Show() it)然后返回,不影响已经实例化并显示的frmMain实例(您实例化Class1的实例)。

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