How to call forms from another class? - c#

I want to call a chart from another class. The code of the chart is this:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
chart1.Series["S1"].Points.AddXY(0, 0, 10);
chart1.Series["S1"].Points.AddXY(0, 0, 10);
}
}
and I want to call this chart from another different class, I tried that:
Form1 chart1 = new Form1();
chart1.Show();
Thanks!

For access forms class and controls from another class, there are simple and more secure methods(link) to do what you want :
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
chart1.Series["S1"].Points.AddXY(0, 0, 10);
chart1.Series["S1"].Points.AddXY(0, 0, 10);
}
}
Form chart1 = (Form)Application.OpenForms["Form1"];
//do here what you want

I am assuming you want to access a specific Form1. Not a new one. You can give a reference to it to the other class or make a reference to it static. For example create a field in Form1 like this:
public static Form1 Chart;
and in the constructor do Chart = this; Then you can access it anywhere with Form1.Chart.

Related

How do i pass/use a method from form1 in a new class?

In form1 i have a method i changed it to public:
public bool ComparingImages(Bitmap File1)
{
}
Then i created a new class and did:
private Form f1;
public SimulateDownloads(Form form1)
{
f1 = form1;
}
Then in the new class bottom in another method i did:
bool downloaded = f1.ComparingImages(test);
But f1 does not contain ComparingImages
I tried also to add to form1 constructor:
private SimulateDownloads simdownloads;
public Form1()
{
InitializeComponent();
simdownloads = new SimulateDownloads(this);
But i don't want to run the program first i want to be able now without running the program to call the method ComparingImages in form1 to call it from the new class.
The problem you're having is that your SimulateDownloads method is taking in an object of type Form instead of type Form1. Remember, you put the public method on a class called Form1, you did not add it to the base Form class!
Try this:
// (This is in your other form, not Form1)
private Form1 f1;
public SimulateDownloads(Form1 form1)
{
f1 = form1;
}
Then you should be able to do this in your other form:
bool downloaded = f1.ComparingImages(test);
It sounds like your ComparingImages shouldn't be in the form1 at all. Create a new class Utils or similar and put ComparingImages in that class. Then you can use
bool downloaded = new Utils().ComparingImages(test); //or Utils.ComparingImages(test); if you make it static
from both SimulateDownloads and form1

Accesing Richtextbox from a class

I'm trying to append text in my richtextbox which is called ConsoleText. It's not working very well. I'm using a property in my form to access the richtextbox in the Class.
It looks like this:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//Skipped the rest
public string ACText
{
set
{
ConsoleText.AppendText(value);
}
}
Now from my class's constructor.
public McDonalds(string email, string pass)
{
Form1 f = new Form1();
f.ACText = "test";
}
It's not showing any text in my richtextbox sadly. I know it works, because i can in the property use a messageBox and see that the value is passed into it.
Thanks in advance i really need help with this.
Calling Form1 f = new Form1(); does not give you a reference to an existing form, it creates a new one with blank/default values in the form's controls.
HOW to solve this greatly depends on your design. If you want to tie your class to that form implementation, our class needs either a reference to the form, a reference to the control, or the value of the control that you're interested in passed to it.
For example:
public McDonalds(string email, string pass, Form1 form)
{
form.ACText = "test";
}
A cleaner solution would be to RETURN a value from your McDonalds class and let the FORM set the control value appropriately rather than tying your class to that form class.
you can use Singleton:
Singletons make having single instances easy. They allow for single allocations and instances of data. We review the singleton types. We see one of the fastest implementations. And we review other possibilities.
public partial class Form1 : Form
{
public static Form1 instance = null;
public Form1()
{
instance = this; //add this class to singleton
InitializeComponent();
}
public void Show(string Message)
{
MyConsole.Text = Message;
}
another class:
Form1.instance.Show("blah blah");
Create Delegate in Form1 Class binded method ACText (string val), and Pass the Delegate to McDonalds Class. Fire the Delegate
namespace YourNameSpace
{
public delegate void RichTextBoxDelegate(string text);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void ACText(string s)
{
ConsoleText.AppendText(s);
}
// In Some Method Call MCDonald's form
public void ShowMcDonalds()
{
RichTextBoxDelegate deleg = new RichTextBoxDelegate(ACText);
MCdonalds ob = new McDonalds(deleg);
ob.show();
}
}
}
Pass the deleg to McDonalds form
Just fire the Delagate
public McDonalds(RichTextBoxDelegate sp)
{
Form1 f = new Form1();
sp("This is Test");
}
deleg("Test value"); // form McDonald's Form

Changing controls properties from other class

I'm using CompactFramework to make a WinCE App.
I have a Form1 and a Class1. In the Form1 I have a label1 which I need to get access from Class1.
If I try:
Form1.label1
it doesn't appear, despite I set Modifier property to public.
How could I get access to the label?
Thanks for any help!
The issue is that Form1 is a class, and you need an instance of that class, because your label is not static.
var myForm = new Form1();
myForm.label1.Text = "hello";
Obviously you don't want to create the new form from your class, because your application likely created the form.
So you should pass the form into the class. Does the class get instantiated by the form? If so you can pass "this" into the class to send a reference to the instantiated form.
But really, you don't want to do this, because its difficult to maintain. Better would be to have the class raise some sort of event that the form could subscribe to to update itself.
You can instance Form1 to Class1 and then use this instance to set Form1.label1.
This would be an elegant solution. Check this code:
public partial class Form1 : Form
{
public Label Label1 { get; set; }
public void Caller()
{
MyClass cls = new MyClass();
cls.Form1 = this;
cls.DoSomeJob();
}
}
public class MyClass
{
public Form1 Form1 { get; set; }
public void DoSomeJob()
{
Form1.Label1.Text = "Some text...";
}
}
Try to create property or method on the Form1 class to return label1 object

Instantiate in the class

I am working on something and I have to instantiate the class. My question is where would I do that at? Would I do it before this:
public partial class Form1 : Form
{
InputClass myclass = new InputClass();
public Form1()
{
InitializeComponent();
}
Or
public partial class Form1 : Form
{
public Form1()
{
InputClass myclass = new InputClass();
InitializeComponent();
}
Here is another code I am working on but it is not working out to well this is what my code looks like right now:
public partial class Form1 : Form
{
InputClass myClass = new InputClass();
myClass.yourname = "";
myClass.Banner = "";
public Form1()
{
InitializeComponent();
}
I am new to C# and I am trying to figure this out. I need to instantiate the class. Then when the page load add to set the labels text from the _banner variable. Then add code to set the property yourname from the text in the textbox when the user presses the button. Then i need to clear the textbox. I also have to display the name in a messagebox from the class.
class InputClass
{
public string _banner;
private string _yourName;
public InputClass(String _banner)
{
this._banner = _banner;
}
public string yourName
{
get { return _yourName; }
set { _yourName = value; }
}
}
}
If you want to access your object from other methods in your class then you need to use a member field rather than a local variable.
private InputClass myClass = new InputClass { YourName = "", Banner = "" };
public Form1()
{
InitializeComponent();
}
Another option is to declare a member field but initialize it inside the constructor:
private InputClass myClass;
public Form1()
{
InitializeComponent();
this.myClass = new InputClass { YourName = "", Banner = "" };
}
This isn't too useful in your specific case, but it can be useful if you need to pass parameters from your constructor to the InputClass constructor.
You can only set the properties inside a function body! not inside the class context.
Instantiating the class would work inside Form1() or at declaration time. IMO best style in your case would be:
public partial class Form1 : Form
{
InputClass myclass;
public Form1()
{
InitializeComponent();
myclass = new InputClass();
}
}
This enables one to use myClass not only in the Form1 constructor, but also in any other function.
First of all, make the distinction between Declaration and Instantiation. In your first snippet, you're declaring the InputClass member in the class scope, meaning it will be shared by all methods in the class. Once you do that, it doesn't matter if you instantiate it in the constructor or during declaration, it (mostly) works out to the same thing.
Secondly, I'm guessing that this is an ASP.NET project, since you refer to "page load". If so, remember that your Form1 instance doesn't stay alive between page loads. Every time you reload the page, either manually with F5 or via button-clicks/postbacks, you're creating a new instance of Form1, which will create a new instance of InputClass.
What you're doing in the first example is a declaration of a member variable of Form1 named myclass. You can assign it a value at the same place, which is fine:
public partial class Form1 : Form
{
InputClass myclass = new InputClass();
public Form1()
{
InitializeComponent();
}
}
But you usually cannot insert actual code statements in your class declaration (like the assignment myClass.yourname = ""). You need to put them in the constructor. So a correct way to do this would be:
public partial class Form1 : Form
{
InputClass myClass = new InputClass();
public Form1()
{
myClass.yourname = "";
myClass.Banner = "";
InitializeComponent();
}
}
For performing actions on button click, look here: http://msdn.microsoft.com/en-us/library/43sxkdeb(v=vs.80).aspx

Using the selected index of a combobox in an If statement of a different form

I'm trying to reference the selected index of a combobox on my mainform in an if statement inside a method on a second form. Some google searching has confused me a bit. The most obvious answer I can see is just making the combobox control on the mainform public, however the websites I've been reading seem to indicate that this is not the prefered method? If this is the case what is the prefered method? I've coded in the secondary constructor method on the second form to accept the first form as a parameter when called, for example:
Form2 form = new Form2(this);
form.Show();
And on the second form:
public partial class Form2 : Form
{
Form1 form1;
public Form2()
{
InitializeComponent();
}
public Form2(Form1 fr1)
{
InitializeComponent();
form1 = new Form1();
form1 = fr1;
So I thought I could just do something like form1.combobox1.SelectedIndex, but no dice....what is the 'community prefered' method to go about doing this?
Well you can just return SelectedIndex property of the combobox by doing something like this in Form1 class or whatever form that is containing the combobox.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public int SelectedIndex
{
get
{
return comboBox.SelectedIndex;
}
}
}
Then in order to call it, just continue what you were doing before
public partial class Form2 : Form
{
Form1 form1;
public Form2()
{
InitializeComponent();
}
public Form2(Form1 fr1)
{
InitializeComponent();
// get rid of this line it's unnecessary
// form1 = new Form1();
form1 = fr1;
}
}
and call the property wherever needed in your Form2 class like this form1.SelectedIndex.
Avoid this section if it's confusing, but you don't really need to create a field for Form1. Use Form's ParentForm instead and cast it to Form1 whenever needed like ((Form1)this.ParentForm).SelectedIndex
On your main form, create a public property that returns the combobox.

Categories

Resources