开发者

help with c# array

开发者 https://www.devze.com 2023-01-25 13:01 出处:网络
I have adatatable with two columns. I want to store the rows of each column in an array so that I can return rows for each individual column. This way I believe I can populate a list box(the option te

I have a datatable with two columns. I want to store the rows of each column in an array so that I can return rows for each individual column. This way I believe I can populate a list box(the option text as one column and the option value as开发者_高级运维 the other column).

Here is what I started out with:

public object dbAccess2()
{
    ArrayList arg = new ArrayList();
    DataTable myTable = GenericDataAccess.ExecuteSelectCmd("Vehicle_GetMakes");


        foreach (DataRow dRow in myTable.Rows)
        {
            arg.Add(dRow["VehicleMake"]);
            arg.Add(dRow["VehicleMakeId"]);
        }

    return arg.ToArray();   
}


You can make a class to hold each individual row in this case and use a List<T> to hold the data, like this:

public class Vehicle
{
    public string Make { get, set };
    public string MakeId { get, set };
}

..

List<Vehicle> Vehicles = new List<Vehicle>();

..

foreach (DataRow dRow in myTable.Rows)
{
    Vehicles.Add(
        new Vehicle {
            Make = arg.Add(dRow["VehicleMake"]),
            MakeId = arg.Add(dRow["VehicleMakeId"])
        });
}

And later, you can easily populate a listbox with this list:

listBox.DataSource = Vehicles;
listBox.DisplayMember = "Make";

But I think you may want to use a ListView probably.


Don't use the ArrayList class, it's practically obsolete. Use arrays or generic lists instead, so that you get a typed result.

You can get the columns into lists like this:

List<string> makes = myTable.Rows.Select(r => (string)r["VehicleMake"]).ToList();
List<int> makeIds = myTable.Rows.Select(r => (int)r["VehicleMakeId"]).ToList();

Or into arrays:

string[] makes = myTable.Rows.Select(r => (string)r["VehicleMake"]).ToArray();
int[] makeIds = myTable.Rows.Select(r => (int)r["VehicleMakeId"]).ToArray();

An alternative to populating a dropdown (as that is what I assume that you mean, as a ListBox doesn't have options) from arrays is to use data binding:

theDropdown.DataTextField = "VehicleMake";
theDropdown.DataValueField = "VehicleMakeId";
theDropdown.DataSource = myTable;
theDropdown.DataBind();


What you're attempting is to manipulate real objects without the benefit of object design, invoking raw data instead. This has very broad and far-reaching problems and is quite far behind current development strategies - to broad to go into here but not least of your problems is building in a brittle coupling between your application and your database.

Step one is to model an actual Vehicle class.

public class Vehicle  
{  
    public string MakeId { get; set; }

    public string Make { get; set; }          
} 

Step two is to build a managing class for your Vehicles ("Fleet" perhaps?) which can abstract the Vehicle collection behind an IEnumerable interface. Internally you will store the Vehicles collection as a concrete generic collection (a List or Dictionary most likely) and avoid at all costs the really-should-be-considered-obsolete ArrayList structure.

public class Fleet
{
    private List<Vehicle> _vehicles = new List<Vehicle>();

    public IEnumerable<Vehicle> Vehicles { return this._vehicles;}
}

Step three is to internalise to this class (or a class behind this one or behind that one etc, etc) the CRUD operations which will interact with the Database stored data. That's truly an implementation detail, but one you'll apply for all similar classes throughout your architecture.

At this point you'll be able to work with the IEnumerable property directly with standard Databinding methods.

0

精彩评论

暂无评论...
验证码 换一张
取 消