我有一个有两列的数据表。我想将每列的行存储在一个数组中,以便我可以为每个列返回行。这样我相信我可以填充一个列表框(选项文本作为一列,选项值作为另一列)。
以下是我的开始:
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();
}
答案 0 :(得分:1)
在这种情况下,您可以创建一个类来保存每一行,并使用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。
答案 1 :(得分:1)
不要使用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();
答案 2 :(得分:0)
您尝试的是在没有对象设计的情况下操纵真实对象,而是调用原始数据。这涉及到非常广泛且影响深远的问题,并且远远落后于当前的开发策略 - 广泛地介绍到这里,但至少你的问题是在应用程序和数据库之间建立一种脆弱的耦合。
第一步是为实际的车辆类建模。
public class Vehicle
{
public string MakeId { get; set; }
public string Make { get; set; }
}
第二步是为您的车辆(也许是“舰队”)构建一个管理类,它可以在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属性。