在单个datagridview中显示来自相关表的数据

我在db中有一些表:

Items Manufacturers Categories Cities Regions ============== ================ ============ ======== ========== ItemId ManufacturerId CategoryId CityId RegionId ManufacturerId CityId NameCategory RegionId NameRegion CategoryId NameManufacturer NameCity NameItem Weight 

我使用以下代码显示DataGridView中的项目列表:

 DataSet ds = new DataSet(); SqlDataAdapter da = new SqlDataAdapter("select * from Items", connectionString); SqlCommandBuilder cmdBldr = new SqlCommandBuilder(da); da.Fill(ds, "Items"); dataGridView1.DataSource = ds.Tables[0]; 

我还有一个按钮,使用以下代码保存DataGridView的更改:

 da.Update(ds, "Items"); 

我想在datagridview中替换两列 – ManufacturerIdCategoryId ,以及相关表中的NameManufacturerNameCategory 。 因此,这两列应该是ComboBox,其中包含相关表中的所有可能名称 – 以便能够将CategoryManufacturer更改为其他并使用da.Update()保存它。

我还需要为datagridview添加三个comboboxfilter: CategoryCityRegion ,它们将按照这些filter中的选定值过滤datagridview中显示的项目。

我不能使用向导创建者,我必须在代码中完成所有操作。 如果你能给我一些与此相关的想法,那就太棒了。

ComboBox专栏

对于要作为combobox的每个列,您应该创建DataGridViewComboBoxColumn的实例并设置这些属性并将其添加到网格的Columns

  • DataSource :要在combobox中显示的项目列表
  • DataPropertyName :网格数据源的属性名称,您希望combobox绑定到该网格。
  • DisplayMember :combobox中显示的combobox的数据源列的名称
  • ValueMember :从combobox中选择项目时使用其值的combobox的数据源列的名称。

例如,这里是CategoryId列的代码:

 var categoryAdapter= new SqlDataAdapter("SELECT * FROM Categories", connectionString); var categoryTable= new DataTable(); categoryAdapter.Fill(categoryTable); var categoryComboBoxColumn=new DataGridViewComboBoxColumn(); categoryComboBoxColumn.Name="categoryComboBoxColumn"; categoryComboBoxColumn.HeaderText="Category"; categoryComboBoxColumn.DataSource = categoryTable; categoryComboBoxColumn.DataPropertyName = "CategoryId"; categoryComboBoxColumn.DisplayMember= "NameCategory"; categoryComboBoxColumn.DisplayMember= "CategoryId"; this.dataGridView1.Columns.Add(categoryComboBoxColumn); 

过滤

要过滤网格,可以将表达式分配给主数据表的DefaultView.RowFilter

例如,要基于CategoryId进行过滤,您可以创建一个System.Windows.Forms.ComboBox控件,并将其命名为categoryComboBox并将其绑定到类别以显示类别列表,并将其DisplayMember设置为NameCategory ,将其ValueMember设置为该组合中的CategoryId框然后:

 var table = ((DataTable)dataGridView1.DataSource); table.DefaultView.RowFilter = string.Format("CategoryId = {0}", categoryComboBox.SelectedValue); 

您可以通过将filter设置为null或为空来重置filter。

您还可以使用和/或创建表达式:

 var criterias = new List(); if(categoryComboBox.SelectedIndex > 0) criterias.Add(string.Format("CategoryId = {0}", categoryComboBox.SelectedValue); if(cityComboBox.SelectedIndex > 0) criterias.Add(string.Format("CityId = {0}", cityComboBox.SelectedValue); var table = ((DataTable)dataGridView1.DataSource); table.DefaultView.RowFilter = string.Join(" And " , criterias);