• 0

Global variables available across multiple forms?


Question

Hey guys, just starting out with some C# programming, and atm I have the following,

frmMain - Form

frmAdd - Form

clsVideoLibrary - Class

frmMain declares a clsVideoLibrary, and loads everything into the class.. all fine and dandy.. however, the Add form adds in new items into the class.. atm, I have to pass everything back into frmMain and create a special function purely for the task (I guess it would depend on how my code is written), which is going to suck, as I'm going to basically redeclare this entire class inside of frmMain. Atm, I'm doing this by passing it frmMain.

Back in the old days of VB6, you used to just declare it as a global variable and stick it inside of a module, and all was well and everyone could access the class. But C# is a real poop about such things!

Is there any easy way to make the class available to other forms? As I'm going to have alot of classes and alot of forms, so it mightn't be entirely practical to pass the class files to the forms by reference or whatever.

w00t, 1234 posts :p

9 answers to this question

Recommended Posts

  • 0

Global variables don't exist in .NET, and rightfully so. It's a bad idea to use global variables, and if you're finding your code needs one, you should probably look at how your code is designed and change some things so you don't need a global variable.

If your Add form is a data collection window that returns data to your Main form, then you can (should?) add a method to your Main form that the Add form will use. You can also create an object to act as a container for the data between your two forms.

  • 0

So you're trying to open an AddForm from the MainForm that will allow the user to input a new video and add it to your Video library, yeah?

In which case id say you need another object... clsVideo. frmMain has an instance of clsVideoLibrary. frmAdd has a public instance of clsVideo. When the user clicks Save/Add in frmAdd you save the new video to the public instance of clsVideo. Then in your MainForm code where you open the AddForm you can do something like:

//Video library
clsVideoLibrary myVideoLibrary = new clsVideoLibrary();

//Open the AddForm
frmAdd objAddForm = new frmAdd();
objAddForm.ShowModal();

//Add the Video entered in the AddForm to the VideoLibrary
myVideoLibrary.Add( objAddForm.myNewVideo )

You'll probably also wanna do some checks to see if its null first - in case they press Cancel on the AddForm or something.

There are ways to do 'global variables' in .Net - Express showed one. But as John said, if you find yourself needing to use them - then you should be re-designing your code.

Oh... and VB6 sucks! :D

  • 0
  $phinX said:

So you're trying to open an AddForm from the MainForm that will allow the user to input a new video and add it to your Video library, yeah?

In which case id say you need another object... clsVideo. frmMain has an instance of clsVideoLibrary. frmAdd has a public instance of clsVideo. When the user clicks Save/Add in frmAdd you save the new video to the public instance of clsVideo. Then in your MainForm code where you open the AddForm you can do something like:

//Video library
clsVideoLibrary myVideoLibrary = new clsVideoLibrary();

//Open the AddForm
frmAdd objAddForm = new frmAdd();
objAddForm.ShowModal();

//Add the Video entered in the AddForm to the VideoLibrary
myVideoLibrary.Add( objAddForm.myNewVideo )

You'll probably also wanna do some checks to see if its null first - in case they press Cancel on the AddForm or something.

There are ways to do 'global variables' in .Net - Express showed one. But as John said, if you find yourself needing to use them - then you should be re-designing your code.

Oh... and VB6 sucks! :D

Hmm, I like, I like alot. :) I have a struct defined for Video already so should be easy to implement. :)

Yeah... but global variables make 'sense'. :( And don't knock VB6, was a great language :( I dunno, I don't like like the idea of having my code thrown all over the place. Inside AddForm it writes the new element to the XML doc, and then adds it to clsVideoLibrary to save my reloading... which I personally see as being related code that should be lumped together....maybe I really should just rip everything out of AddForm and write everything in frmMain? Hmmmmmm

  • 0

Your code isn't "thrown all over the place" in .NET. Rather the opposite; it's organized into objects that make it easier to do your work. Sometimes this may take a little extra work, but in the end, it simplifies things immensely. Global variables make sense to you now, but if/when you learn .NET, you'll discover how truly convoluted VB6 is.

  • 0

Ok, so I have it all working, but I'm getting some warnings,

frmAdd.Add -> Add it!

		public VideoCollection.VideoItem VideoToAdd = new VideoCollection.VideoItem();

		private void btnAdd_Click(object sender, EventArgs e)
		{
			VideoToAdd.CatID = 1;
			VideoToAdd.Title = txtTitle.Text;
			VideoToAdd.Location = txtLocation.Text;
			VideoToAdd.ImageID = Int32.Parse(txtImage.Text);
			this.Close();
		}

frmMain.Show Add Form button

 private void btnShowAdd_Click(object sender, EventArgs e)
		{
			frmAdd MyAddForm = new frmAdd();
			MyAddForm.ShowDialog();

//......XML + collection code here
			   XMLNewAttribute.Value = MyAddForm.VideoToAdd.CatID.ToString();

Atm, I get the following warning,

  Quote

Warning 1 Accessing a member on 'VideoLibrary.frmAdd.VideoToAdd' may cause a runtime exception because it is a field of a marshal-by-reference class C:\Documents and Settings\Phillip\My Documents\Visual Studio 2005\Projects\VideoLibrary\VideoLibrary\Form1.cs 193

Any ideas what that is all about? :\

  • 0

	public struct VideoItem
	{
		public int ID;
		public int CatID;
		public string Title;
		public string Location;
		public int ImageID;
	}

:)

Ok, copying it to a local variable seems to do the trick. Why though? :\

Edited by Pc_Madness
  • 0
  Pc_Madness said:

	public struct VideoItem
	{
		public int ID;
		public int CatID;
		public string Title;
		public string Location;
		public int ImageID;
	}

:)

Ok, copying it to a local variable seems to do the trick. Why though? :\

If it is global then why not make it a class? That way it will be passed around as a reference. Structs will be passed by value.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • I almost picked one up...Best Buy has a heck of a time getting them, much less keep them in stock.
    • Microsoft bans LibreOffice developer's account without warning, rejects appeal by David Uzondu Recently, we reported on LibreOffice, accusing Microsoft of intentionally using complex file formats as a tactic to lock in users to Microsoft Office, hindering open source alternatives like LibreOffice. Now, Microsoft has banned LibreOffice developer, Mike Kaganski, from using its services, citing an "activity that violates [its] Services Agreement". According to Mike, this happened last Monday when he tried to send a technical email to the LibreOffice dev mailing list, which is a normal part of his routine, but Thunderbird returned an error saying the message couldn't be sent. His account was blocked upon retry, and he found himself completely logged out of his Microsoft account. Kaganski guessed that his mail and account were getting flagged by a bot or something, since he was quite sure that nothing in the mail violated Microsoft's terms of service. So he decided to file an appeal, a process which later made him call Redmond "miserably incompetent in IT." The automated system asked for his phone number, which he provided, only to be greeted by a "Try another method" error message. The problem was that there was no other method offered. He then decided to reach out to Microsoft support directly. After some digging, he found a link to contact the team, and there it was, a button asking him to "Sign in to Contact support". Now, you might go, "Hold up, how is he supposed to sign in to contact support when his problem is that he can't sign in in the first place?" As Kaganski himself put it: He eventually got to use his wife's account to file an appeal and finally received a message from support. The instructions inside asked him to go to the sign-in page and, when told the account is blocked, provide a phone number (something he had already tried). Microsoft ignored his detailed report of the failing process, marked his ticket as resolved without any real action, and simply closed it. He is yet to recover his account. As for the email he was trying to send, he was later able to use Gmail, and it went through with no problem. If you are interested, you can read the full email for yourself and see if it violates Microsoft's services agreement. Mike's not the only person who's had their account locked recently, with seemingly no way to recover it. On the 17th of last month, Reddit user u/deus03690 shared how Microsoft locked their account, which, among other things, contained 30 years of "irreplaceable photos and work" on OneDrive. Their appeal, like Mike's, has been fruitless so far. The user said Microsoft reached out 10 days later, asking them to fill out a recovery form and promising to help them "every step of the way," but they haven't heard from the company since.
    • It's like Microsoft hasn't learned anything from Internet Explorer fiascos. Or they weren't slapped hard enough financially for it...
    • Yes they're payroll taxes with some of it linked to share-based compensation for employees. So when the stock price was rising in q2 these charges also increased.
  • Recent Achievements

    • Apprentice
      MikeK13 went up a rank
      Apprentice
    • Week One Done
      andeyhawk65 earned a badge
      Week One Done
    • First Post
      Jake2530 earned a badge
      First Post
    • Explorer
      Deranox went up a rank
      Explorer
    • Week One Done
      John Volks earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      687
    2. 2
      ATLien_0
      259
    3. 3
      Xenon
      178
    4. 4
      neufuse
      135
    5. 5
      +FloatingFatMan
      100
  • Tell a friend

    Love Neowin? Tell a friend!