Help! Stupid C# Problem

G

Guest

I'm having a stupid problem with V.S./C#. I've created a class and two
subclasses, and I want to instantiate either of hte subclasses after users
make a selection. Then I want to use that class to modify its members as
users make more selections. IT'S NOT WORKING DAMN IT!

The following is my asp.net behind code for the web form, and then my class
code. I'm getting an error when I try to access the class instance that I
previously created. (yes, i've tried this different ways within my
application namespace)

---------------------------
asp.net web form code
---------------------------

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace agitatorSz
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>
public class main_frm : System.Web.UI.Page
{
public System.Web.UI.WebControls.Button tankType_btn;
protected System.Web.UI.WebControls.Button dimensions_btn;
protected System.Web.UI.WebControls.TextBox impellers_txt;
protected System.Web.UI.WebControls.TextBox agitators_txt;
protected System.Web.UI.WebControls.Label volume_txt;
protected System.Web.UI.WebControls.Label turnover_txt;
protected System.Web.UI.WebControls.Label gpm_txt;
protected System.Web.UI.WebControls.DataGrid product_grd;
protected System.Web.UI.WebControls.TextBox length_txt;
protected System.Web.UI.WebControls.TextBox width_txt;
protected System.Web.UI.WebControls.TextBox diameter_txt;
protected System.Web.UI.WebControls.TextBox depth_txt;
protected System.Web.UI.WebControls.Button model_btn;
protected System.Web.UI.WebControls.DropDownList model_ddl;
protected System.Web.UI.WebControls.Button powerSrc_btn;
protected System.Web.UI.WebControls.DropDownList power_ddl;
protected System.Web.UI.WebControls.TextBox maxMudLvl_txt;
protected System.Web.UI.WebControls.DropDownList tankType_ddl;

private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tankType_btn.Click += new
System.EventHandler(this.tankType_btn_Click);
this.model_btn.Click += new System.EventHandler(this.model_btn_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

//**************************************************************//
//Global (namespace-wide) declarations
//**************************************************************//

public static string tankTypeVar;

private void tankType_btn_Click(object sender, System.EventArgs e)
{
tankTypeVar=tankType_ddl.SelectedItem.Value;
switch(tankType_ddl.SelectedItem.Value)
{
case "1":
{
rt = new roundTank();
//enable controls relevant to class, disable others
diameter_txt.Enabled=true;
length_txt.Enabled=false;
width_txt.Enabled=false;
break;
}
case "2":
{
st = new squareTank();
//enable controls relevant to class
length_txt.Enabled=true;
width_txt.Enabled=true;
diameter_txt.Enabled=false;
break;
}
}
}

private void model_btn_Click(object sender, System.EventArgs e)
{
if(tankTypeVar=="1")
{
rt.orientation=model_ddl.SelectedItem.Value;
depth_txt.Text=rt.orientation;
}
if(tankTypeVar=="2")
{
st.orientation=model_ddl.SelectedItem.Value;
depth_txt.Text=st.orientation;
}
}
}
}

------------
class code
------------

using System;

namespace agitatorSz
{
/// <summary>
/// Summary description for tank.
/// </summary>
public class tank
{
public tank()
{
}
public float powerSource;
public string orientation; //horizontal or vertical (values are: H or V)
public float depth;
public float maxMudLvl;
public int agitatorQty;
public int impellerQty;
public float mudVolume;
public float turnoverRatio;
public float GPM;
}

public class roundTank
{
public roundTank()
{
}
public float diameter;
}

public class squareTank
{
public squareTank()
{
}
public float length;
public float width;
}
}
 
R

Robbe Morris [C# MVP]

I didn't see where "rt" or "st" variables are originally declared.
I see where you instantiate them based on conditions though.

That said, my guess is that your project is far better suited
for the Parameterized Factory Pattern. I think you'll find your code a lot
easier to support especially when new types of tank shapes
are added. No more, "if this" or "if that" crap all over your app.

http://www.eggheadcafe.com/articles/20031103.asp

--
2004 and 2005 Microsoft MVP C#
Robbe Morris
http://www.robbemorris.com
http://www.masterado.net/home/listings.aspx
 
G

Guest

Oops. Here it is:
(I also tried declaring rt and st in the namespace before i instantiated it
in the event, but that didn't work)

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace agitatorSz
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>
public class main_frm : System.Web.UI.Page
{
public System.Web.UI.WebControls.Button tankType_btn;
protected System.Web.UI.WebControls.Button dimensions_btn;
protected System.Web.UI.WebControls.TextBox impellers_txt;
protected System.Web.UI.WebControls.TextBox agitators_txt;
protected System.Web.UI.WebControls.Label volume_txt;
protected System.Web.UI.WebControls.Label turnover_txt;
protected System.Web.UI.WebControls.Label gpm_txt;
protected System.Web.UI.WebControls.DataGrid product_grd;
protected System.Web.UI.WebControls.TextBox length_txt;
protected System.Web.UI.WebControls.TextBox width_txt;
protected System.Web.UI.WebControls.TextBox diameter_txt;
protected System.Web.UI.WebControls.TextBox depth_txt;
protected System.Web.UI.WebControls.Button model_btn;
protected System.Web.UI.WebControls.DropDownList model_ddl;
protected System.Web.UI.WebControls.Button powerSrc_btn;
protected System.Web.UI.WebControls.DropDownList power_ddl;
protected System.Web.UI.WebControls.TextBox maxMudLvl_txt;
protected System.Web.UI.WebControls.DropDownList tankType_ddl;

private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tankType_btn.Click += new
System.EventHandler(this.tankType_btn_Click);
this.model_btn.Click += new System.EventHandler(this.model_btn_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

//**************************************************************//
//Global (namespace-wide) declarations
//**************************************************************//

public static string tankTypeVar;

private void tankType_btn_Click(object sender, System.EventArgs e)
{
tankTypeVar=tankType_ddl.SelectedItem.Value;
switch(tankType_ddl.SelectedItem.Value)
{
case "1":
{
roundTank rt = new roundTank();
//enable controls relevant to class, disable others
diameter_txt.Enabled=true;
length_txt.Enabled=false;
width_txt.Enabled=false;
break;
}
case "2":
{
squareTank st = new squareTank();
//enable controls relevant to class
length_txt.Enabled=true;
width_txt.Enabled=true;
diameter_txt.Enabled=false;
break;
}
}
}

private void model_btn_Click(object sender, System.EventArgs e)
{
if(tankTypeVar=="1")
{
rt.orientation=model_ddl.SelectedItem.Value;
depth_txt.Text=rt.orientation;
}
if(tankTypeVar=="2")
{
st.orientation=model_ddl.SelectedItem.Value;
depth_txt.Text=st.orientation;
}
}
}
}
 
G

Guest

----------------------
application code
----------------------
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace agitatorSz
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>
public class main_frm : System.Web.UI.Page
{
public System.Web.UI.WebControls.Button tankType_btn;
protected System.Web.UI.WebControls.Button dimensions_btn;
protected System.Web.UI.WebControls.TextBox impellers_txt;
protected System.Web.UI.WebControls.TextBox agitators_txt;
protected System.Web.UI.WebControls.Label volume_txt;
protected System.Web.UI.WebControls.Label turnover_txt;
protected System.Web.UI.WebControls.Label gpm_txt;
protected System.Web.UI.WebControls.DataGrid product_grd;
protected System.Web.UI.WebControls.TextBox length_txt;
protected System.Web.UI.WebControls.TextBox width_txt;
protected System.Web.UI.WebControls.TextBox diameter_txt;
protected System.Web.UI.WebControls.TextBox depth_txt;
protected System.Web.UI.WebControls.Button model_btn;
protected System.Web.UI.WebControls.DropDownList model_ddl;
protected System.Web.UI.WebControls.Button powerSrc_btn;
protected System.Web.UI.WebControls.DropDownList power_ddl;
protected System.Web.UI.WebControls.TextBox maxMudLvl_txt;
protected System.Web.UI.WebControls.DropDownList tankType_ddl;

private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tankType_btn.Click += new
System.EventHandler(this.tankType_btn_Click);
this.model_btn.Click += new System.EventHandler(this.model_btn_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

//**************************************************************//
//Global (namespace-wide) declarations
//**************************************************************//

public static string tankTypeVar;

private void tankType_btn_Click(object sender, System.EventArgs e)
{
tankTypeVar=tankType_ddl.SelectedItem.Value;
switch(tankType_ddl.SelectedItem.Value)
{
case "1":
{
roundTank rt = new roundTank();
//enable controls relevant to class, disable others
diameter_txt.Enabled=true;
length_txt.Enabled=false;
width_txt.Enabled=false;
break;
}
case "2":
{
squareTank st = new squareTank();
//enable controls relevant to class
length_txt.Enabled=true;
width_txt.Enabled=true;
diameter_txt.Enabled=false;
break;
}
}
}

private void model_btn_Click(object sender, System.EventArgs e)
{
if(tankTypeVar=="1")
{
rt.orientation=model_ddl.SelectedItem.Value;
depth_txt.Text=rt.orientation;
}
if(tankTypeVar=="2")
{
st.orientation=model_ddl.SelectedItem.Value;
depth_txt.Text=st.orientation;
}
}
}
}


----------------
class code
----------------
using System;

namespace agitatorSz
{
/// <summary>
/// Summary description for tank.
/// </summary>
public class tank
{
public tank()
{
}
public float powerSource;
public string orientation; //horizontal or vertical (values are: H or V)
public float depth;
public float maxMudLvl;
public int agitatorQty;
public int impellerQty;
public float mudVolume;
public float turnoverRatio;
public float GPM;
}

public class roundTank:tank
{
public roundTank()
{
}
public float diameter;
}

public class squareTank:tank
{
public squareTank()
{
}
public float length;
public float width;
}
}
 
M

Morten Wennevik

You don't really tell what your problem is. What errors do you get (copy/paste the exact error message is helpful)?

In your tankType_btn_Click you create one of the tanks but you don't store the references anywhere so they will be destroyed when the method returns.

You could also store the information about width/length/diameter in your parent and set this information when you create the child

public class Tank
{
public bool HasLength = false;
public bool HasWidth = false;
public bool HasDiameter = false;
}

public class RoundTank : Tank
{
public RoundTank()
{
HasDiameter = true;
}
}

public class SquareTank : Tank
{
public SquareTank()
{
HasLength = true;
HasWidth = true;
}
}

In your tankType_btn_Click you could then do (no {} blocks needed in case)

Tank t = null;
switch(tankType_ddl.SelectedItem.Value)
{
case "1":
t = new RoundTank();
break;
case "2":
t = new SquareTank();
break;
}

if(t != null)
{
diameter_txt.Enabled = t.HasDiameter;
length_txt.Enabled = t.HasLength;
width_txt.Enabled = t.HasWidth;
}
 
G

Guest

"Store the reference;" Damn! That's the problem. Thanks a lot man. What the
hell was I thinking? I appreciate your help.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top