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
Related
I want to create a multiple objects of a class, edit them on one form and then use those objects on multiple forms. Hopefully the code below will try and highlight the problem.
I created a class as such...
public class Player
{
public string name;
public int goals;
}
On Form1 I have created tom and dan, and added buttons that will increase their goal count when pressed.
public partial class Form1 : Form
{
Player tom = new Player()
{
name = "Tom",
goals = 5
};
Player dan = new Player()
{
name = "Dan",
goals = 7
};
public void UpdateForm()
{
label1.Text = tom.name;
label2.Text = dan.name;
}
public Form1()
{
InitializeComponent();
UpdateForm();
}
private void button1_Click(object sender, EventArgs e)
{
tom.goals += 1;
}
private void button2_Click(object sender, EventArgs e)
{
dan.goals += 1;
}
}
I then want to be able to display their names and the new number of goals on form2. The problem I have is that those objects don't exist in that context.
{
public partial class Form2 : Form
{
public void UpdateForm2()
{
label1.Text = tom.name;
label2.Text = tom.goals;
label3.Text = dan.name;
label4.Text = dan.goals;
}
public Form2()
{
InitializeComponent();
UpdateForm2();
}
}
}
How do I make those objects global and editable between forms? I've tried to find an answer but haven't found one that quite matches this use case. I would appreciate any help and advice.
Your Form1 class is like any other class. Therefore, you can create 2 properties in it:
public partial class Form1 : Form
{
public Player Tom { get; private set; }
public Player Dan { get; private set; }
this.Tom = new Player()
{
name = "Tom",
goals = 5
};
this.Dan = new Player()
{
name = "Dan",
goals = 7
};
// The rest of your code
}
In Form2 introduce a property:
public partial class Form2 : Form
{
public Form1 CallingForm {get; set;}
public Form2()
{
InitializeComponent();
UpdateForm2();
}
}
Set that property before you show the second form like this (put this code in your first form):
Form2 f2 = new Form2();
f2.CallingForm = this;
Then in the second form you can access the players like this:
label1.Text = CallingForm.Tom.name;
If you have more players then create a List<Player> property instead.
Some other notes
Try following the .NET naming conventions and instead of public fields, use properties. Properties can be used for databinding and encapsulation, validation and has other benefits as well.
public class Player
{
private int goals;
public string Name {get; set;}
public int Goals
{
get { return this.goals; }
set
{
if (value < 0)
{
throw new ArgumentException("Goals cannot be less than 0.");
}
this.goals = value;
}
}
}
You need to know the concept of namespace. If you create an object in namespace of one form, you cannot use that particular object without referring that particular form.
So far what I can see, you've created two instances of object player in form namespace. But that's not there in form2 namespace. Hence you're getting that error.
You can use many methods commonly used to update such as
calling child window's method to update the values.
using mediator
adding an event listener to form2 on value change.
Using a global instance of an object instance or a static object is not a best practice.
You can pass the list of players in the constructor of the second form.
Yes , must transport data new form. Meybe use
send parameter to Form2 contructor parameter or use form2 Set Method.
For Example :
private readonly Player _tom;
private readonly Player _dan;
public Form2(player tom, player dan) // or use List<Player> parameter
{
InitializeComponent();
_tom = tom;
_dan = dan;
}
another way
// Form2.cs
private Player _tom;
private Player _dan;
public void SetPalyers(Player tom, Player dan)
{
_tom = tom;
_dan = dan;
}
Think about encapsulation. Your Form2 cannot access the instantiated class objects because they are contained within Form1.
When you write the following:
label1.Text = tom.name;
The compiler is looking for the object Form2.tom, but it doesn't exist.
You have to tell it where to look, like so:
label1.Text = Form1.tom.name;
To make these objects available to all chosen classes without using the Form1 prefix, the chosen classes would have to be subclasses of Form1. Other than that, you'd have to refer back to them in the way I explained previously.
It seems like you need a service class that holds a List<Person>. Then just have your two forms share the same instance of that service. Or the lazy option is to make the service a static class.
Update
You could also consider implementing the Observer pattern in the service.
http://www.dofactory.com/net/observer-design-pattern
I have following problem i have 2 windows forms and to send data between them i figured out that in Form2(which is called by Form1) constructor i will be passing reference to Form1 .
Like this public Form2(Form callingForm)
{
mainForm = callingForm as Form1;
InitializeComponent();
}
But I would like Form2 to be singleton and somehow I don't know how to achieve that along with passing form1's reference to form2. I reviewed documentation https://msdn.microsoft.com/en-us/library/ff650316.aspx and I have no clue how to edit this example to fit my needs. So I am able to make singleton constructor or make constructor that takes reference to form1, but not both.
If Form1 is your application's Main Form then you should use --> Appliction.MainForm. That way you don't need the parameter.
Edit: I was not trying to be obtuse and not answer your question. You can create a singleton with parameters using multiple constructors, however, I would try to avoid it.
private Singleton(param1,param2)
public static Singleton MyInstance(param1,param2)
I am not sure I am understand your question very well, but I think, you can implement Lazy.. (Lazy itself implements Singleton pattern). Maybe something like this:
class Form1
{
public Form2 Callee
{
get;
set;
}
public Form1()
{
Callee = Form2.Instance(this).Value;
}
}
class Form2
{
public static Lazy<Form2> Instance(Form1 caller)
{
return new Lazy<Form2>(() =>
{
return new Form2(caller);
});
}
public Form1 Caller
{
get;
private set;
}
Form2(Form1 caller)
{
Caller = caller;
}
}
Ok i seem to have solved this problem, here is the code:
private Form1 mainForm = null;
public Form2(Form callingForm)
{
mainForm = callingForm as Form1;
InitializeComponent();
}
public static Form2 Instance
{
get
{
if (instance == null)
{
instance = new Form2(Application.OpenForms[0] as Form1);
}
return instance;
}
}
#lrb thank you, basically i had problem in this line, cuz couldn't pass anything as parameter
instance = new Form2(Application.OpenForms[0] as Form1);
and Application.OpenForms[0] helped.
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
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
I have a simple windows application in C# with 3 forms.
first form is main form (its name is FrmMain), second is FrmData and third is FrmShow.
In main form (FrmMain) I have created an instance from second form (FrmData) and show it :
public partial class FrmMain : Form
{
public Form FrmModifyData; //for FrmData
int PersonCode;
public FrmMain()
{
InitializeComponent();
}
private void btnShowDataForm_Click(object sender, EventArgs e)
{
FrmModifyData= new FrmData();
FrmModifyData.ShowDialog();
}
}
but I can't access from FrmModifyData to FrmMain fields like PersonCode .
How can I access to creator object's field?
Note: I'm a beginner.
thanks.
You would need to add a property to your FrmModifyData class to take an instance of the FrmMain class. Then you can do this:
FrmModifyData = new FrmData();
FrmModifyData.ParentData = this;
FrmModifyData.ShowDialog();
Then inside FrmModifyData you would have access to the public members of FrmMain. Obviously this is kind of quick and dirty and not very reusable so i would suggest adding more explicit properties to FrmModifyData with only the data you need to use.
If you want to access PersonCode field, you should declare it as public. No visibility modifier will make it private, hence not accesible from other casses.
I would make it something like this.
With this way you're able to use the FrmModifyData in other forms.
I know it's an old post, but yes, you did read it :)
public partial class FrmMain : Form
{
// public Form FrmModifyData; <-- do not declare it in your FrmMain
// (is't a modal dialog, so you won't get more instances)
public int PersonCode {get; set;}
public FrmMain()
{
InitializeComponent();
}
private void btnShowDataForm_Click(object sender, EventArgs e)
{
FrmData FrmModifyData = new FrmData();
FrmModifyData.PersonCode = this.PersonCode;
DialogResult result = FrmModifyData.ShowDialog();
if(result == DialogResult.Ok)
{
// do something with the result
this.PersonCode = FrmModifyData.PersonCode;
}
}
}