Solved

DataSet to ArrayList?

Posted on 2004-08-19
4
864 Views
Last Modified: 2012-08-14

Hello, new to .Net. I'm trying to present feedback to a user through data they will upload in an excel spreedsheet. I can get the file just fine onto a machine and display it through a datagrid. What I would really like to do is through it into memory, present it back to the user with different row styles depending on the information in the row (for errors) and also return an imagebutton with each row allow for the row to be editred in memory prior to ultimately being saved to the database.

Question is this: What is the best way to put the information from the excel sheet into memory, so that it can be spit back with dynamic style application and an additional WebControl?

I'm thinking I could use an ArrayList (becuase it's fast to update and flexible in size) but I don't know how to get all that into the arraylist and back into another DataList Control.

Here is what I have so far, thanks in advance!!

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


namespace Com.Presentation
{
      /// <summary>
      /// Summary description for Upload.
      /// </summary>
      public class Upload : Com.Presentation.Components.BaseCode
      {
            protected System.Web.UI.WebControls.DataGrid DataGrid1;
            protected System.Web.UI.HtmlControls.HtmlInputFile File1;
            protected System.Web.UI.WebControls.Button cmdUpload;
            protected System.Web.UI.WebControls.Label lblMessage;
     
            string sFileDir = "C:\\";
            long lMaxFileSize = 100000;
     
            private void Page_Load(object sender, System.EventArgs e)
            {
            }
 
            private void DeleteFile(string sFileName)
            {
                  /* Delete file , if it exists and I've put it on the server */
                  if (sFileName.Trim().Length > 0)
                  {
                        FileInfo fi = new FileInfo(sFileName);
                        if (fi.Exists)
                        {    
                              fi.Delete();
                        }
                  }
            }
 
 
            #region Web Form Designer generated code
            override protected void OnInit(EventArgs e)
            {
                  InitializeComponent();
                  base.OnInit(e);
            }
             
            private void InitializeComponent()
            {  
                  this.cmdUpload.Click += new System.EventHandler(this.cmdUpload_Click);
                  this.Load += new System.EventHandler(this.Page_Load);
            }
            #endregion
 
 
            private void cmdUpload_Click(object sender, System.EventArgs e)
            {
          if ((File1.PostedFile != null) && (File1.PostedFile.ContentLength > 0))
                  {
                        /* get file name */
                        string sFileName = System.IO.Path.GetFileName(File1.PostedFile.FileName);
                        try
                        {
                              /* file can't be more than the declared size at begining of page */
                              if (File1.PostedFile.ContentLength <= lMaxFileSize)
                              {
                                    /* save it */
                                    File1.PostedFile.SaveAs(sFileDir + sFileName);
                                    lblMessage.Visible = true;
                                    lblMessage.Text= "got " + sFileDir + sFileName + "  loaded ok";

                                    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + File1.PostedFile.FileName + ";Extended Properties=Excel 8.0;";
                                    OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", strConn);
                                    DataSet myDataSet = new DataSet();

                                    myCommand.TableMappings.Add("Table" , "ExcelInfo");
                                    myCommand.Fill(myDataSet);
                                    DataGrid1.DataSource = myDataSet.Tables[0].DefaultView;
                                    DataGrid1.DataBind();
                              }
                              else
                              {
                                    /* file too big, reject it */
                                    lblMessage.Visible = true;
                                    lblMessage.Text = "file size over " + lMaxFileSize;
                              }
                        }
                        catch(Exception)
                        {
                              lblMessage.Visible = true;
                              lblMessage.Text = "some kind of error";
                              DeleteFile(sFileDir + sFileName);
                        }
                  }
            }


      }
}


0
Comment
Question by:animated405
4 Comments
 
LVL 3

Accepted Solution

by:
bigjim2000 earned 83 total points
ID: 11849841
Well, I'd make a struct that has members for each colum.

Then go through all the rows in your data set, and populate that struct, and add it to the arraylist.

This would be a MUCH more friendly solution compared to adding the data set rows themselves to the array....

-Eric
0
 
LVL 7

Assisted Solution

by:NipNFriar_Tuck
NipNFriar_Tuck earned 84 total points
ID: 11852242
I like using classes and strongly typed collections...

public class MyDataClass {
   private string field1;
   private int field2;
   // etc

   public string Field1 {
       get { return field1; }
       set { field1 = value; }
   }
   public string Field2 {
       get { return field2; }
       set { field2 = value; }
   }
   // etc

   // the rest of the class
}

public class MyDataCollection : CollectionBase {
   // see help on how to implement
}

The nice thing about using a strongly typed collection is that you can then assign the collection to the datasource for a datagrid.... i.e.

MyDataCollection myCollection = new MyDataCollection();
DataGrid1.DataSource = myDataCollection;

Lastly, the reasom that I like this approach is that if I have to write a function that is to work against the collection I can put that function in my collection class.  Some functions that I have put there are Load, Save, and Filter.  Basically, the load gets the data from the DB, creates the class and passes a record to that classes Load, and adds the new instance to itself.  The save loops through itself calling the save on each instance...

Hope this helps...
nipnfriar_tuck
0
 
LVL 96

Assisted Solution

by:Bob Learned
Bob Learned earned 83 total points
ID: 11852333
Realize, though, that Structures are value type variables, and ArrayLists expect reference types, so boxing/unboxing is required to add the structure to the ArrayList.  This is not a significant problem for small amounts of data, but can add considerable overhead if you have large number of records.

Boxing and Unboxing of Value Types in C#: What You Need to Know
http://www.c-sharpcorner.com/Code/2003/July/BoxNUnboxSSF.asp

My suggestion would be to use a Class definition instead of structure.

Bob
0
 

Author Comment

by:animated405
ID: 11855102

Thanks for the replies. I'm still kind of confused, but your comments are helping me look more in the right direction. I'm keeping this open as I'm sure I have more comments soon.
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Suggested Solutions

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…
We all know that functional code is the leg that any good program stands on when it comes right down to it, however, if your program lacks a good user interface your product may not have the appeal needed to keep your customers happy. This issue can…
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…
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…

708 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

16 Experts available now in Live!

Get 1:1 Help Now