繁体   English   中英

帮助C#数组

[英]help with c# array

我有一个有两列的数据表。 我想将每列的行存储在一个数组中,以便我可以为每个列返回行。 这样,我相信我可以填充一个列表框(选项文本作为一列,选项值作为另一列)。

这是我开始的:

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();   
}

在这种情况下,可以使一个类容纳每个单独的行,并使用List<T>容纳数据,如下所示:

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"])
        });
}

然后,您可以轻松地用以下列表填充列表框:

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

但我想你可能想要使用ListView。

不要使用ArrayList类,它实际上已经过时了。 请改用数组或通用列表,以便获得类型化结果。

您可以将列添加到列表中,如下所示:

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

或分成数组:

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

从数组填充下拉列表(因为我认为你的意思是,因为ListBox没有选项)是使用数据绑定:

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

你正在尝试的是在没有对象设计的情况下操纵真实对象,而是调用原始数据。 这涉及到非常广泛且影响深远的问题,并且远远落后于当前的开发策略 - 广泛地介绍这一点,但至少你的问题是在应用程序和数据库之间建立一种脆弱的耦合。

第一步是模拟实际的Vehicle类。

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

    public string Make { get; set; }          
} 

第二步是为您的Vehicles建立一个管理类(也许是“舰队”?),它可以在IEnumerable接口后面抽象Vehicle集合。 在内部,您将Vehicle集合存储为具体的通用集合(最有可能是List或Dictionary),并且不惜一切代价避免真正应该被认为是过时的ArrayList结构。

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

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

步骤三是内在化到这个类(或这背后的一个或后面的是一个等,等一类)CRUD操作将与数据库中的存储数据进行交互。 这确实是一个实现细节,但您将在整个架构中应用所有类似的类。

此时,您将能够使用标准数据绑定方法直接使用IEnumerable属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM