在单个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中替换两列 – ManufacturerId
和CategoryId
,以及相关表中的NameManufacturer
和NameCategory
。 因此,这两列应该是ComboBox,其中包含相关表中的所有可能名称 – 以便能够将Category
或Manufacturer
更改为其他并使用da.Update()保存它。
我还需要为datagridview添加三个comboboxfilter: Category
, City
和Region
,它们将按照这些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);