Henrik Pettersson
Henrik Pettersson

Reputation: 41

Call method/class from different file

I'm terribly new so I might be completely off track overall with what I'm trying to do.

I don't really know how to ask the question, my english is a bit rocky.

But I have 2 files one containing this:

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

And another file containing this:

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

What I'm trying to get is that when I'm running the program and clicking label1 I want it to disappear. But it doesn't. I don't get any errors or anything. Any help is appreciated :).

Thanks in advance.

Upvotes: 0

Views: 156

Answers (6)

Rune FS
Rune FS

Reputation: 21742

You are setting the visibility of the label of another form (one that's not being displayed.

this line of code in the Visibility method creates a new object

frmMain c = new frmMain();

It's of the same type as the form being display, but it's a different object, that's not displayed. If you insert a line after the above

c.Show();

you should see the newly created form and also see that the label disappears

However there's a straight forward fix to your problem. Change the event handler to this

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

The sender object is the control that was clicked, and since the event is attached to the label it self. All you need to do is cast the sender to the type of a Label and then you can access the visible property. Alternatively you could do this:

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

That uses the current object (aka this) and gets the label from that object.

Upvotes: 0

Hossein Narimani Rad
Hossein Narimani Rad

Reputation: 32481

You may change your code this way:

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

Then

public partial class Class1
{
    public void Visibility(FrmMain form)
    {
       form.Go();            
    }
}

Upvotes: 0

RFerwerda
RFerwerda

Reputation: 1277

First: Why are you trying to let the label on your mainform dissappear by using another class?

I would suggest the following:

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

I think the reason why your code isn't working is that inside the function Visibility() of Class1 you are creating a new frmMain and on that frmMain you are setting the visible property of label1 to false. So you are actually working with a different form.

Upvotes: 1

CodeCaster
CodeCaster

Reputation: 151594

You do not want to let Class1 know about frmMain. Change it to something like this:

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

And from your form, call it like this:

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

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

Your current implementation of Class1 initializes a new frmMain, hides that form's Label1, does not do anything with that instance (e.g. it does not Show() it) and then returns, not affecting the already instantiated and shown frmMain instance (the one you instantiate Class1 from).

You can change this by passing the label or even the form into Class1, but that is just bad design.

Upvotes: 0

decPL
decPL

Reputation: 5402

What you're doing is you're creating a second instance of your window (which might not be obvious to you, as you're not displaying it). Then you are hiding the label in your second window. Probably not what you intended in the first place.

What you need to do is to pass a reference to your original form to the method you're calling, or (depending what you want to do) a reference to the control you need to hide:

in Class1:

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

in frmMain.cs

new Class1.Visibility(this.label1)

few more comments:

  • Naming: do not use names like Class1, label1; I appreciate this is probably just 'play around with' kind of code, but such names are completely unreadable when you try to come back to your code later (or get someone else to have a look)
  • Naming 2: try to name your methods to describe what they will do - HideControl, or HideLabel is much better than Visiblity
  • You may want to read some basic C# tutorials to learn about references, instances, parameters, etc.

Other than that, happy C#-ing :)

Upvotes: 0

Simon Whitehead
Simon Whitehead

Reputation: 65079

You are instantiating a new, separate form. This means the label is being hidden.. but on a hidden form you have created.

You need to pass the current form instance into your other class:

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

Then call it like this:

new Class1().Visibility(this);

Upvotes: 0

Related Questions