Link to home
Start Free TrialLog in
Avatar of jvalescu
jvalescuFlag for United States of America

asked on

Another C# Array of objects question


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.
Avatar of jvalescu
jvalescu
Flag of United States of America image

ASKER

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;

            }
      }
}
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
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.................

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
ASKER CERTIFIED SOLUTION
Avatar of Dmitry G
Dmitry G
Flag of New Zealand image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
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.
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;}
            }

      }
}
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial