如何从与组合框共享列的数据表中确定行索引

How to determine a row index from a datatable that shares a column with a combobox

我有一个combobox和一个datatable

我已将 datatable 中一列的所有元素添加到 combobox 项中。 现在,每当用户在组合框中选择一个项目时,我想转到 datatable 并比较该列,如果匹配,它会执行一些代码。

我有以下

        private void comboBox8_SelectedIndexChanged(object sender, EventArgs e)
    {
        string str = comboBox8.SelectedItem.ToString();
       int z = 0;
        foreach (var row in datatable.Rows)
        {
            int i = 0; i++;

            if (datatable.Rows[row]["Cidade"] == str)
            {

                z = i;
            }

        }
    }

"Cidade" 是与组合框中的选项匹配的列名。 问题是代码没有将 ìf 条件识别为有效,表示存在无效参数

编辑:像这样解决:

 private void comboBox8_SelectedIndexChanged(object sender, EventArgs e)
    {
        string str = comboBox8.SelectedItem.ToString();

        int z = 0;


        for (int i = 0; i < DataAccess.Instance.tabelasismica.Rows.Count; i++)
        {

            if (DataAccess.Instance.tabelasismica.Rows[i]["Cidade"] == str)
            {

                z = i;
            }

        }
        MessageBox.Show(z.ToString());
        MessageBox.Show(DataAccess.Instance.tabelasismica.Rows[z]["Cidade"].ToString());
    }

datatable.Rows[row]["Cidade"]object 类型 - 在将它与 str 进行比较之前,您需要将其转换为字符串,如下所示:

if (datatable.Rows[row]["Cidade"].ToString() == str)
{ ... }

执行此类操作的标准方法是使用数据绑定。您只需将 ComboBox 的 DataSource 设置为您的 DataTable。代码大致如下所示:

comboBox8.DataSource = datatable;
comboBox8.DisplayMember = "Cidade"
comboBox8.ValueMember = "PrimaryKeyColumnOfYourTable"

现在在 SelectedIndexChanged 事件中,您只需使用 comboBox8.SelectedValue 属性 即可获取所选行的 ID。如果您有强类型数据集,您的数据表将有一个名为 FindByYourPKColumn() 的函数,您可以使用该函数查找使用此 ID 的行。

试试这个代替 for 循环

foreach (DataRow row in dDataAccess.Instance.tabelasismica.Rows)
  {
      if (row["Cidade"].ToString() == str)
      {
          z = dDataAccess.Instance.tabelasismica.Rows.IndexOf(row);
      }
  }

foreach (DataRow row in dataTable.Rows)
  {
      if (row["Cidade"].ToString() == str)
      {
          z = dataTable.Rows.IndexOf(row);;
      }
  }

也就是说,将组合框、列表框等与数据源一起使用时的标准做法是在数据中有一个不同的列-table 指定为组合框的 ValueMember,这让生活变得更加轻松 - 如@dotNET 建议。

comboBox8.DataSource= dataTable; //the data table which contains data
comboBox8.ValueMember = "id";   // column name which you want in SelectedValue
comboBox8.DisplayMember = "name"; // column name that you need to display as text

这样您就不必遍历数据表来查找行的索引,并且可以根据需要使用 ID (ValueMember) 继续处理。

示例here

@dotNET 的回答是解决您的特定问题的首选方法。

然而,要解决一般问题,请在数据集中找到一个值,您最好的选择是

使用 ADO.NET 方法 Find or Select 例如

var results = dataset.Select(string.Format("Cidade = {0}",str));
if (results.Count() != 0 )
{
      ...
}

或使用System.Data.DataSetExtensions

if (datatable.AsEnumerable().Any( x=> x.Field<string>("Cidade") == str ))
{
  ....
}