【发布时间】:2018-07-14 08:23:34
【问题描述】:
我的代码:
private void InitGrid(DataTable dataTable, ref DataGridView grid, bool resetColumns)
{
if (grid.Columns.Count > 0)
{
if (resetColumns)
{
grid.Columns.Clear();
grid.DataSource = null;
}
else
{
return;
}
}
DataGridViewColumn column;
grid.AutoGenerateColumns = false;
// apply entire data from table to grid.
grid.DataSource = dataTable;
// set column properties according to their type (combo, text, etc.)
foreach (DataColumn col in dataTable.Columns)
{
if (m_ColumnTypes[col.ColumnName].Equals("COMBO"))
{
// get query number to load specific column's data
string adminQuery = Server.LoadData("633", new List<string>() { col.ColumnName, m_TableFullName }).Rows[0][0].ToString();
column = new DataGridViewComboBoxColumn();
string queryParam = Controller.MainController.User;
switch (col.ColumnName.ToUpper())
{
case "FIELD1NAME":
(column as DataGridViewComboBoxColumn).DisplayMember = col.ColumnName;
(column as DataGridViewComboBoxColumn).ValueMember = "field1id";
break;
case "FIELD2NAME":
(column as DataGridViewComboBoxColumn).DisplayMember = col.ColumnName;
(column as DataGridViewComboBoxColumn).ValueMember = "field2id";
queryParam = string.Concat("select column_value from table(fn_mgr_workspaces('", Controller.MainController.User, "'))");
break;
case "PRIORITY":
(column as DataGridViewComboBoxColumn).DisplayMember = col.ColumnName;
(column as DataGridViewComboBoxColumn).ValueMember = col.ColumnName;
queryParam = "10";
break;
}
(column as DataGridViewComboBoxColumn).DataSource = Server.LoadData(adminQuery, new List<string>() { queryParam });
}
else
{
column = new DataGridViewTextBoxColumn() { AutoSizeMode = m_ColumnTypes[col.ColumnName].Equals("TAGS") ? DataGridViewAutoSizeColumnMode.Fill : DataGridViewAutoSizeColumnMode.AllCells, ReadOnly = true };
}
column.Name = col.ColumnName.ToUpper();
column.HeaderText = m_ColumnNameTranslations[col.ColumnName.ToUpper()];
column.DataPropertyName = column is DataGridViewComboBoxColumn ? (column as DataGridViewComboBoxColumn).ValueMember : col.ColumnName;
grid.Columns.Add(column);
}
// after setting columns. going over every row and trying to filter out the datasource of field2. this is where my problem is
foreach (DataGridViewRow dgvr in grid.Rows)
{
if (!dgvr.IsNewRow)
{
string wsId = dgvr.Cells["filed1id"].Value.ToString();
DataTable filteredData = ((dgvr.Cells["field2name"] as DataGridViewComboBoxCell).DataSource as DataTable).Select("thefieldname = " + wsId).CopyToDataTable();
DataView dv = filteredData.DefaultView;
dv.Sort = "field2name";
(dgvr.Cells["field2name"] as DataGridViewComboBoxCell).DataSource = null;
(dgvr.Cells["field2name"] as DataGridViewComboBoxCell).DisplayMember = "field2name";
(dgvr.Cells["field2name"] as DataGridViewComboBoxCell).ValueMember = "field2id";
(dgvr.Cells["field2name"] as DataGridViewComboBoxCell).DataSource = dv.ToTable();
}
}
}
(出于安全目的,字段名称和一些对象名称被打乱了)
我的问题:
作为 ComboboxColumn 的 field2 的 DataSource 不会改变。它总是向我显示整个数据,而不是我尝试为其设置的过滤数据。 即使我将其无效并将其重新设置为过滤后的数据,它也不起作用。
我想要实现的是 field2 列中的 DataSource 应该依赖于网格每一行的 field1 的数据。
我尝试为其他列设置数据源,而不是为 field2 设置它,然后遍历每一行并在 field2 上设置过滤的数据源,但它完全为空,好像为每一行设置的数据源还没有完全有效。
我做错了什么。我该怎么办?
【问题讨论】:
标签: c# winforms datagridview binding datasource