Chakratos
Chakratos

Reputation: 49

use Winform Objects inside an Static Method

I have a problem that I could ignore a long time but now I have to solve it.
I have 3 GUI (Winform) 1 Main 1 Settings and 1 for a Webbrowser.
I need to call a Method that is in my Webbrowser Form inside my Main Form for that reason the Method is a static one.

But if I set it to static it give´s me an error if I try to work with the Objects from the Form.

    public partial class Form3 : Form
{
    public Form3()
    {
        InitializeComponent();
    }
    public static void WebLyrics(string url){
        webBrowser1.Navigate(url);
    }
}

Upvotes: 2

Views: 1655

Answers (3)

Krumelur
Krumelur

Reputation: 32497

The easiest (= least code) way to solve it is probably to use singletons for the forms as other have suggested, or even simpler to use the built in forms registry:

var myForm3 = Application.OpenForms.OfType<Form3>.FirstOrDefault();

I would probably prefer to use a separate singleton for holding the forms, as I would find it more maintainable. This would be a better separation of concerns in that the forms would not have to be created as singletons and could be reused in other ways. It is truly your app's UI layout that is the singleton.

Something like this:

public class AppLayout
{
    public static AppLayout Instance {
        get { ... }
    }
    public WebBrowserForm WebBrowser {get;private set;}
    public MainForm Main {get;private set;}
    public SettingsForm Settings {get;private set;}
}

Think of it like a typed variant of the Application singleton.

Upvotes: 1

t3chb0t
t3chb0t

Reputation: 18645

The easiest way is to:

Add a static Instance property to the webbrowser form:

public partial class Form3 : Form
{
    public Form3()
    {
        InitializeComponent();
        Instance = this;
    }

    public static Form3 Instance { get; private set; }

    public void WebLyrics(string url)
    {
        webBrowser1.Navigate(url);
    }
}

and call the WebLyrics method via the Instance property in the other form:

public partian class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Navigate() 
    {
        Form3.Instance.WebLyrics("www.stackoverflow.com");
    }
}

I assumed you create both forms somewhere somehow...

Upvotes: 1

msporek
msporek

Reputation: 1197

You should consider changing the code. Why is your Form having a static method? It doesn't make any sense. The easiest way to achieve it is to pass reference to the Webbrowser Form into the Main Form. Or you can instantiate the Webbrowser form inside you Main Form and then show it.

But I suggest that you introduce a way of separating the UI from the business logic layer. Consider to introduce MVC / MVP pattern, to have a clear separation, and then the forms do not need to have references to each other directly.

Upvotes: 1

Related Questions