【问题标题】:Pulling a list of Access table primary IDs into an array将 Access 表主 ID 列表拉入数组
【发布时间】:2014-05-31 08:33:19
【问题描述】:

我正在使用带有表适配器的 Visual Studio 2012 和 Access 2010。这是一个学校项目。

我目前正在使用 C# 开发一个系统,该系统使用带有表 CUSTOMER 的 Access 数据库,该表与表 VEHICLE 具有一对多的关系。这样一个客户就可以与许多车辆相关联。

将车辆输入系统时,需要一个显示系统中所有客户姓名的组合框以将该车辆关联到(车辆必须与客户关联)。

我的问题是 CUSTOMER 表使用自动增量,因此当删除客户时,客户 ID 不再一定是连续的。我的组合框的逻辑假设最重要的客户名称是客户 ID 1,第二个是 2,依此类推。这导致我的应用程序不一致。

我解决此问题的想法是在运行时按顺序将客户表中的所有客户 ID 加载到一个数组中,然后使用该数组作为参考(显然使用添加和删除的客户更新它)。但是,我不确定如何编写代码逐步遍历表格以获取 id,或者即使这是最好的解决方案。有什么想法吗?

【问题讨论】:

  • 既然您谈到ComboBox,您是在使用Windows 窗体应用程序吗?
  • 为什么首先要破坏序列?如果您将组合框与客户一起加载并将 ValueMember 属性设置为客户的 Id 字段,为什么还要麻烦序列?
  • @drew_w:是的,我使用的是 Windows 窗体。
  • @Crono:我没有意识到这是可能的。我将在午餐时间阅读组合框。

标签: c# .net winforms ms-access-2010 auto-increment


【解决方案1】:

不要永远依赖与记录自动增量编号匹配的结果集中的记录位置。这不仅绝对不可靠,而且在 UI 过滤或排序方面可能会带来各种挑战。例如,在您的场景中,您可能希望您的组合框按字母顺序按名称排序。因此,依赖记录索引匹配记录自增值肯定会导致错误和数据损坏。

现在转到您的实际问题...假设您的 Customer 类是这样的:

class Customer
{
    public int Id {get; set;}
    public int Name {get; set;}
}

您可以将组合框绑定到 Customer 对象的集合并设置其两个属性:

combobox.DisplayMember = "Name";
combobox.ValueMember = "Id";

DisplayMember 属性告诉您的控件应该使用对象的哪个属性在列表中显示,而ValueMember 确定它使用哪个字段作为值。后者对于databinding 尤其有用,我相信您应该在您的场景中使用它

当您想以编程方式访问所选客户的 Id 值时,只需检查 combobox.SelectedValue 属性即可。

您也可以使用draw_w 的技术,但请注意,虽然它也有效,但如果可能的话,它在数据绑定中使用起来并不容易。

【讨论】:

    【解决方案2】:

    将数据添加到 Windows 窗体组合框的一种可能解决方案是确保您的对象覆盖“ToString”。然后您可以将实际对象放在组合框列表中。假设您的对象定义如下:

    public Class Customer {
       public int CustomerId { get; set; }
       public string First { get; set; }
       public string Last { get; set; }
    
       // here is where you decide what to display in the combo box:
       public override string ToString() { return First + Last; }
    }
    

    然后您只需将项目正常添加到组合框中:

    // declare customers
    Customer []myCustomers = null;
    
    // load customers ... then show:
    myCombobox.Items.AddRange(myCustomers);
    

    现在当用户在选择的索引中选择一个客户时,您可以执行以下操作来获取实际的客户对象

    var customerObject = (Customer)myCombobox.Items[myCombobox.SelectedIndex];
    

    现在您不必担心它们被添加到组合框或索引或任何东西的顺序。对象存储数据库中的 id,一切都基于此!祝你好运!

    【讨论】:

      【解决方案3】:

      当您加载客户时。将 value 字段设置为 customerID,将 text 字段设置为 customerName 字段

      【讨论】:

      • 我实际上已经这样做了,但我需要使用 SelectedValue 选项并将其转换为 int。感谢大家。 ReturnedCustomerID = (int)customercombo.SelectedValue;
      猜你喜欢
      • 1970-01-01
      • 2017-10-15
      • 2014-08-27
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多