我在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添加三个组合框过滤器:
Category
,City
和Region
,会根据这些过滤条件中的选定值过滤数据网格视图中显示的项目。
我不能使用向导创建者,我必须在代码中完成所有操作。 如果你能给我一些与此相关的想法,那就太棒了。
答案 0 :(得分:3)
对于您希望成为组合框的每一列,您应创建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);
要过滤网格,您可以为主数据表分配expression到DefaultView.RowFilter
。
例如,要根据CategoryId
进行过滤,您可以创建一个System.Windows.Forms.ComboBox
控件,并将其命名为categoryComboBox
,并将其绑定到类别以显示类别列表并设置其DisplayMember
1}}到NameCategory
以及该组合框中的ValueMember
到CategoryId
然后:
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);