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

时间:2015-11-06 19:41:18

标签: c# winforms datagridview combobox

我在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添加三个组合框过滤器: CategoryCityRegion,会根据这些过滤条件中的选定值过滤数据网格视图中显示的项目。

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

1 个答案:

答案 0 :(得分:3)

ComboBox列

对于您希望成为组合框的每一列,您应创建DataGridViewComboBoxColumn的实例并设置这些属性并将其添加到网格的Columns

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

例如,这里是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);

过滤

要过滤网格,您可以为主数据表分配expressionDefaultView.RowFilter

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

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

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

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

var criterias = new List<string>();
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);