Solved

Another C# Array of objects question

Posted on 2006-10-29
8
323 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
MS Dynamics Made Instantly Simpler

Make Your Microsoft Dynamics Investment Count  & Drastically Decrease Training Time by Providing Intuitive Step-By-Step WalkThru Tutorials.

 
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
 
LVL 30

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

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

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

Suggested Solutions

Article by: Najam
Having new technologies does not mean they will completely replace old components.  Recently I had to create WCF that will be called by VB6 component.  Here I will describe what steps one should follow while doing so, please feel free to post any qu…
Introduction Although it is an old technology, serial ports are still being used by many hardware manufacturers. If you develop applications in C#, Microsoft .NET framework has SerialPort class to communicate with the serial ports.  I needed to…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …
This video shows how to use Hyena, from SystemTools Software, to update 100 user accounts from an external text file. View in 1080p for best video quality.

710 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