代码之家  ›  专栏  ›  技术社区  ›  The Muffin Man

c数组帮助

c#
  •  0
  • The Muffin Man  · 技术社区  · 14 年前

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

    以下是我的开始:

    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();   
    }
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Yogesh    14 年前

    在这种情况下,可以创建一个类来保存每一行,并使用 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";
    

    但我想你可能想用列表视图。

        2
  •  1
  •   Guffa    14 年前

    不要使用 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();
    

    从数组填充下拉列表的另一种方法是使用数据绑定:

    theDropdown.DataTextField = "VehicleMake";
    theDropdown.DataValueField = "VehicleMakeId";
    theDropdown.DataSource = myTable;
    theDropdown.DataBind();
    
        3
  •  0
  •   annakata    14 年前

    您试图在没有对象设计好处的情况下操作真实对象,而是调用原始数据。这有着非常广泛和深远的问题,并且远远落后于当前的开发策略——这里要广泛地讨论,但至少你的问题是在应用程序和数据库之间建立一种脆弱的耦合。

    第一步是建立一个实际的汽车类模型。

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

    第二步是为你的车辆建立一个管理类(“车队”也许?)它可以在IEnumerable接口后面抽象车辆集合。在内部,您将把Vehicles集合存储为一个具体的泛型集合(很可能是一个列表或字典),并不惜一切代价避免真正应该被视为过时的ArrayList结构。

    public class Fleet
    {
        private List<Vehicle> _vehicles = new List<Vehicle>();
    
        public IEnumerable<Vehicle> Vehicles { return this._vehicles;}
    }
    

    第三步是内化到这个班(或这个班后面或后面的班 那个 与数据库存储数据交互的CRUD操作。这确实是一个实现细节,但是您将在整个体系结构中应用所有类似的类。

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