[英]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.