C#System.Data.DataRowView

时间:2017-01-22 18:04:44

标签: c# sql .net combobox

我几乎试图从组合框中过滤我的datagridview,避免使用数据绑定GUI。我现在的问题是我在组合框中看到System.Data.DataRowView而不是正常值。代码:

    private void Form2_Load(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection(@"Data SourceXXXXX;Initial Catalog=Studio;Integrated Security=True;");
        conn.Open();
        SqlCommand sc = new SqlCommand("SELECT Nome FROM DClub order by Nome", conn);
        SqlDataReader reader;

        reader = sc.ExecuteReader();
        DataTable dt = new DataTable();
        dt.Columns.Add("Nome", typeof(string));
        dt.Load(reader);

        comboBox1.ValueMember = "Nome";
        comboBox1.DisplayMember = "Nome";
        comboBox1.DataSource = dt;

        conn.Close();


        var select = "SELECT *,bell+corp+fasc+app as Obi, bell+corp+fasc+vic+app as Tot,(bell+corp+fasc+vic+app)/5 as Med, (bell+corp+fasc+app)/4 as MedOb FROM DClub order by bell+corp+fasc+vic+app desc";
        var c = new SqlConnection("Data Source=DIEGOPC;Initial Catalog=Studio;Integrated Security=True;"); // Your Connection String here
        var dataAdapter = new SqlDataAdapter(select, c);

        var commandBuilder = new SqlCommandBuilder(dataAdapter);
        var ds = new DataSet();
        dataAdapter.Fill(ds);
        dataGridView1.ReadOnly = true;
        dataGridView1.DataSource = ds.Tables[0];


    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {


        var dataView = ((DataTable)dataGridView1.DataSource).DefaultView;

        if (comboBox1.Text == "Remove filter")
        {
            dataView.RowFilter = string.Empty;
        }
        else
        {
            dataView.RowFilter = $"Nome = '{comboBox1.Text}'";
        }
    }





    }

}

1 个答案:

答案 0 :(得分:0)

在你的上次评论中

  

combo1text包含从查询中检索到的值

很好,但我的意思是字符串本身是什么样的。我假设它是一个匹配Nome列中某个值的字符串?如果没有看到这个“查询”字符串值在组合框中的含义,很难给出一个好的答案。下面,我向表单添加了DataGridViewComboBox,然后使用一些示例数据为DataGridViewComboBox填充了两个DataTables。这似乎与你描述的一样有效。我假设行过滤行:dataView.RowFilter = $"Nome = '{comboBox1.Text}'";只是对DataTables Nome列中的匹配进行过滤。我希望下面的代码有所帮助。

DataTable dgvData;
DataTable cbData;
public Form1() {
  InitializeComponent();
  dgvData = GetDVGData();
  cbData = GetCBData(dgvData);
  dataGridView1.DataSource = dgvData;
  this.comboBox1.SelectedIndexChanged -= new System.EventHandler(this.comboBox1_SelectedIndexChanged);
  comboBox1.DisplayMember = "Filter";
  comboBox1.ValueMember = "Filter";
  comboBox1.DataSource = cbData;
  this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
}

private DataTable GetCBData(DataTable inDT) {
  DataTable dt = new DataTable();
  dt.Columns.Add("Filter", typeof(string));
  dt.Rows.Add("Remove Filter");
  foreach (DataRow dr in inDT.Rows) {
    dt.Rows.Add(dr.ItemArray[1].ToString());
  }
  return dt;
}

private DataTable GetDVGData() {
  DataTable dt = new DataTable();
  dt.Columns.Add("Number");
  dt.Columns.Add("Name");
  dt.Columns.Add("Address");
  dt.Rows.Add("1", "John", "Texas");
  dt.Rows.Add("2", "Mary", "Florida");
  dt.Rows.Add("3", "Tom", "New York");
  dt.Rows.Add("4", "Marvin", "Moon");
  dt.Rows.Add("5", "Jason", "Holland");
  dt.Rows.Add("6", "Teddy", "New York");
  return dt;
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
  var dataView = ((DataTable)dataGridView1.DataSource).DefaultView;

  if (comboBox1.Text == "Remove Filter") {
    dataView.RowFilter = string.Empty;
  }
  else {
    dataView.RowFilter = $"Name = '{comboBox1.Text}'";
  }
}