Solved

Another C# Array of objects question

Posted on 2006-10-29
8
309 Views
Last Modified: 2008-02-01

I'm having trouble accessing array list members contained within a class.  First here is the class:

using System;
using System.Collections;

namespace Inhallation
{
      /// <summary>
      /// Summary description for clsChamberInfo.
      /// </summary>
      public class clsChamberInfo
      {

            
            public int ChamberID;
            public bool Active;
            public string ChamberTitle;
            public ArrayList arAlarmInfo = new ArrayList();
            public ArrayList arDataCapture = new ArrayList();
            public ArrayList arLastData = new ArrayList();
            public ArrayList arNewData = new ArrayList();



            public clsChamberInfo()
            {
                  //
                  // TODO: Add constructor logic here
                  //
            }

            public clsChamberInfo(int chamberid, bool active, string chambertitle, ArrayList [] aralarms)
            {
                  this.ChamberID = chamberid;
                  this.Active = active;
                  this.ChamberTitle = chambertitle;
                        
            }

            public void AddAlarm( string alarmname,string uom,int alarmid,decimal lowvalue,decimal highvalue,bool active,int recordid,decimal highwarning,decimal lowwarning, decimal x2, decimal x, decimal constant, int linear, int equationtype, int calculationtype, int displaydecimals, bool activewarning)
            {
                  this.arAlarmInfo.Add( new clsExposureAlarmInfo(alarmname,uom,alarmid,lowvalue,highvalue,active,recordid,highwarning,lowwarning,x2,x,constant,linear,  equationtype, calculationtype, displaydecimals,  activewarning));
            }

            public void AddData( DateTime runtime, int runnum, int startnum, int positionid, int alarmid, decimal parmvalue, int studyid, int sessionid, int exposurerun, bool inexposure)
            {
                  this.arNewData.Add( new clsExposureData(runtime,runnum,startnum,positionid, alarmid,parmvalue, studyid, sessionid, exposurerun));
            }

            public void CopyData()
            {
                  this.arLastData.Clear();
                  this.arLastData.Add(arNewData);

            }

            public void AppendToDataCapture()
            {
                  this.arDataCapture.Add(arNewData);

            }

            public void ClearNewData()
            {
                  this.CopyData();
                  this.arNewData.Clear();
            }



            public override string ToString()
            {
                  return this.ChamberTitle;
            }
      }
}


From my main program, I want to access the members of the arNewData ArrayList.   Here is a function that I am stuck on :

            private void PlotData()
            {
                  for( int i = 0; i<arChamberInfo.Count; i++)
                  {
                        switch(i)
                        {
                              case 0:
                                    waveformGraph1.PlotYAppend( ((clsChamberInfo) arChamberInfo[i]).<-------Stuck here
                        }
                  }
                  waveformGraph1.PlotYAppend(newPos,2);

            }

arChamberInfo is an ArrayList of clsChamberInfo objects.  I want to get to the arChamberInfo[i].arNewData members, like arChamberInfo[i].arNewData[0].  Thanks for your quick help.  I'll be checking back frequently in you need more clarification.  Thanks.
0
Comment
Question by:jvalescu
  • 4
  • 3
8 Comments
 

Author Comment

by:jvalescu
ID: 17831515
By the way, the ArrayList arNewData is an array of this class, clsExposureData:

using System;
using System.Collections;


namespace Inhallation
{
      /// <summary>
      /// Summary description for clsExposureData.
      /// </summary>
      public class clsExposureData
      {
            DateTime RunTime = DateTime.Now;
            int RunNum = 0;
            int StartNum = 0;
            int PositionID = 0;
            int AlarmID = 0;
            decimal ParmValue = 0;
            int StudyID = 0;
            int SessionID = 0;

            public clsExposureData()
            {
                  //
                  // TODO: Add constructor logic here
                  //
            }

            public clsExposureData( DateTime runtime, int runnum, int startnum, int positionid, int alarmid, decimal parmvalue, int studyid, int sessionid, int exposurerun)
            {
                  this.RunTime = runtime;
                  this.RunNum = runnum;
                  this.StartNum = startnum;
                  this.PositionID = positionid;
                  this.AlarmID = alarmid;
                  this.ParmValue = parmvalue;
                  this.StudyID = studyid;
                  this.SessionID = sessionid;

            }
      }
}
0
 
LVL 7

Expert Comment

by:whatsit2002
ID: 17831525
Please let me know if you have you tried the following.

 waveformGraph1.PlotYAppend(((clsChamberInfo) arChamberInfo[i]).arNewData[0]);

If that works and your question is about how to loop through the second collection, try this:

               for( int i = 0; i<arChamberInfo.Count; i++)
               {
                    switch(i)
                    {
                         case 0:
                              ArrayList al = ((clsChamberInfo) arChamberInfo[i]).arNewData;
                              for (int j=0; j<al.Count; j++)
                              {
                                 waveformGraph1.PlotYAppend(al[j]);
                              }
                    }
               }
               waveformGraph1.PlotYAppend(newPos,2);


Thanks.

Jason
0
 

Author Comment

by:jvalescu
ID: 17831655
Jason,

   Thanks for the quick response.  The line, waveformGraph1.PlotYAppend( ((clsChamberInfo) arChamberInfo[i]).arNewData[0]);, compiles fine, but doesn't work.  PlotYAppend is expecting a double for its parameter.  Second, arNewData[0] would be pointing to the first element of that array of clsExposure Data objects.  I'm interested in getting to the clsExposureData.parmvalue property.  Also, when I tried the loop you made, al[j] does not give me access to clsExposureData properties.  Am I confusing things even more?  I'll be standing by.................

0
 
LVL 7

Expert Comment

by:whatsit2002
ID: 17831710
I see. So you need to do some type casting, it looks like. I presume you are using .NET 1.1 (visual studio 2003) and not 2.0 (visual studio 2005), right? If you were using .NET 2.0, you could simply use a generic list which would make this much, much simpler.

However, on the assumption that you must use ArrayLists, try this, please:

for(int i = 0; i< arChamberInfo.Count; i++)
{
   clsChamberInfo ci = (clsChamberInfo)arChamberInfo[i];
   for (int j = 0; j < ci.Count; j++)
   {
      clsExposureData ed = (clsExposureData)ci.arNewData[j];
      decimal val = ed.parmvalue;
      waveformGraph1.PlotYAppend(val);
   }
}

Also, please make sure that your clsExposureData class has a public property called "paramvalue" because otherwise, you will get a compile error.

Thanks.

Jason
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 29

Accepted Solution

by:
anarki_jimbel earned 100 total points
ID: 17831733
Try that.
If you need to pass a ParmValue to you method you need to :

1. In the clsExposureData class make ParmValue a public property. Really the better way to do that is (unlike your approach)

        private double parmval;

        public double ParmValue
        {
            get{return parmval;}
            set{parmval = value;}
        }

2. Argument to pass: ((clsChamberInfo) arChamberInfo[i]).arNewData[0].ParmValue
0
 

Author Comment

by:jvalescu
ID: 17833551
OK, based on what you've both told me, I've modified my clsExposureData to make each variable a property.  However, I still cannot address it directly.  The class is listed at the bottom of this message.  From my main program, I am trying to get the value, ParmValue, but once I get to here:

decimal pv = ((clsChamberInfo) arChamberInfo[i]).arNewData[0]. <-----  

None of the properties are showing up.  Let me know what else I can do.  Also, Jason, you mentioned "if you must use Array Lists", is there a better way?  If needed, I'll create another so you can get more points.

Thanks.
0
 

Author Comment

by:jvalescu
ID: 17834284
Forgot to list the update class:

using System;
using System.Collections;


namespace Inhallation
{
      /// <summary>
      /// Summary description for clsExposureData.
      /// </summary>
      public class clsExposureData
      {
            private DateTime runtime = DateTime.Now;
            private int runnum = 0;
            private int startnum = 0;
            private int positionid = 0;
            private int alarmid = 0;
            decimal parmvalue = 0;
            private int studyid = 0;
            private int sessionid = 0;

            public clsExposureData()
            {
                  //
                  // TODO: Add constructor logic here
                  //
            }

            
            public DateTime RunTime
            {
                  get{return runtime;}
                  set{runtime=value;}
            }

            public int RunNum
            {
                  get{return runnum;}
                  set{runnum = value;}
            }
            
            public int StartNum
            {
                  get{return startnum;}
                  set{startnum = value;}
            }

            public int PositionID
            {
                  get{return positionid;}
                  set{positionid = value;}
            }

            public int AlarmID
            {
                  get{return alarmid;}
                  set{alarmid = value;}
            }

            public decimal ParmValue
            {
                  get{return parmvalue;}
                  set{parmvalue = value;}
            }

            public int StudyID
            {
                  get{return studyid;}
                  set{studyid = value;}
            }

            public int SessionID
            {
                  get{return sessionid;}
                  set{sessionid = value;}
            }

      }
}
0
 
LVL 7

Assisted Solution

by:whatsit2002
whatsit2002 earned 400 total points
ID: 17834663
Try this:
decimal pv = ((clsExposureData)((clsChamberInfo) arChamberInfo[i]).arNewData[0]).ParmValue;

Also, my remark about array lists was tied to the availability of generic lists in .NET 2.0. In 2.0, you can create a strongly typed list of your objects like so:

List<clsExposureData> myList = new List<clsExposureData>();
myList.Add(new clsExposureData());

Then when you want to access them, you don't have to cast anything from the base type "object" like you do with an array list. You can do things like:

decimal val = myList[0].ParmValue;

Thanks.

Jason
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Introduction Hi all and welcome to my first article on Experts Exchange. A while ago, someone asked me if i could do some tutorials on object oriented programming. I decided to do them on C#. Now you may ask me, why's that? Well, one of the re…
Entity Framework is a powerful tool to help you interact with the DataBase but still doesn't help much when we have a Stored Procedure that returns more than one resultset. The solution takes some of out-of-the-box thinking; read on!
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
Hi friends,  in this video  I'll show you how new windows 10 user can learn the using of windows 10. Thank you.

867 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now