【问题标题】:Initializing Combo Box in C# Access在 C# Access 中初始化组合框
【发布时间】:2016-08-16 06:44:38
【问题描述】:

我试图添加一个可以获取所有产品名称的组合框,但不幸的是,我遵循了一些教程并最终变成了这样。

void fillCombo()
    {
        try
        {
            con.Open();
            OleDbCommand command = new OleDbCommand("Select * from IblInventory");
            command.Connection = con;
            OleDbDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                String product = reader.GetString("ProductName"); // << invalid argument
                cmbProduct.Items.Add(product);
            }
            con.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

可能的原因是什么?

【问题讨论】:

  • 指定错误,“错误”一词没有任何意义。
  • 先生,我有四列。并且在reader.GetString() 上找不到正确的语法,因此我无法运行该程序
  • “我试图添加一个组合框……但是……结果是这样的。这可能是什么原因?”这个问题太模糊了。请详细描述你的问题是什么。你的期望是什么?什么不工作?如果您有一些错误消息 -> 它们是什么?

标签: c# visual-studio ms-access combobox


【解决方案1】:

OleDbDataReader.GetString 的文档中,您会注意到该方法所需的参数是一个整数,表示返回记录中列的位置,而不是其名称。

如果您(正确地)更喜欢使用列名,那么您需要绕道并使用GetOrdinal 方法来检索给定名称的列的位置。

while (reader.Read())
{
    int pos = reader.GetOrdinal("ProductName");
    String product = reader.GetString(pos); 
    cmbProduct.Items.Add(product);
}

另一个与您的情况几乎相同的示例,可以在 MSDN 上关于 OleDbDataReader.GetOrdinal 的文档页面中找到

编写extension method 也是一种常见的做法,它允许您编写代码来隐藏名称和位置之间映射的详细信息。你只需要一个带有

的静态类
public static class ReaderExtensions
{
     public string GetString(this OleDbDataReader reader, string colName)
     {
         string result = "";
         if(!string.IsNullOrEmpty(colName))
         {
             int pos = reader.GetOrdinal(colName);
             result = reader.GetString(pos);
         }
         return result;
     }
     ... other extensions for Int, Decimals, DateTime etc...
}

现在有了这个类并且可以访问,你可以调用

string product = reader.GetString("ProductName");

【讨论】:

    【解决方案2】:

    它在我的项目中工作 首先将您的数据填写到数据表中,请参见下面的代码

    DataTable results = new DataTable();
    
    using(OleDbConnection conn = new OleDbConnection(connString))
    {
        OleDbCommand cmd = new OleDbCommand("Select * from IblInventory", conn);
    
        conn.Open();
    
        OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
    
        adapter.Fill(results);
    }
    

    现在

    cmbProduct.DataSource = results ;
    cmbProduct.DisplayMember = "ProductName";
    cmbProduct.ValueMember = "Id feild of IblInventory table";
    

    【讨论】:

      猜你喜欢
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2010-12-18
      • 2018-10-09
      相关资源
      最近更新 更多