如何从 gridview 中获取 TableName?
How to get TableName from gridview?
我正在使用 entity framework 并像这样填充 gridcontrol;
Models.dbContext ent = new Models.dbContext();
ent.Locations.Load();
gridControl1.DataSource = ent.Locations.Local.ToBindingList();
然后我想Table取个像这样的名字;
DataTable dt = ((DataView)gridview1.DataSource).Table;
Messagebox.Show(dt.TableName);
它给我错误:无法将类型 'System.Data.Entity.Internal.ObservableBackedBindingList`1[Models.Location]' 的对象转换为类型 'System.Data.DataView'.
为什么会这样?我的代码有什么问题?
您可以尝试为 DataGridView 创建扩展方法,以便将其转换为 DataTable:
public static class DataGridViewExtension
{
// Method for: DataGridView to DataTable conversion
public static DataTable ToTable(this DataGridView dataGridView, bool onlyVisible=false)
{
// Identifiers used are:
int rowCount = dataGridView.Rows.Count;
var dataTable = new DataTable();
var columnTypes = new Dictionary<string, Type>();
var rowItems = new List<object>();
// Get the column names and types
columnTypes = dataGridView.ColumnTypes(onlyVisible);
// Setup the DataTable column structure
dataTable.SetupColumns(columnTypes);
// Get the rows of the DataGridView
foreach (DataGridViewRow row in dataGridView.Rows)
{
// Get the row as a list to give to the table
rowItems = row.ToList(onlyVisible);
// Give the row items to the DataTable
dataTable.Rows.Add(rowItems.ToArray());
}
// Return the data table
return dataTable;
}
}
我又做了 3 个扩展,它们是:
public static class DataGridViewExtension
{
// Class for: Getting the column names with column types from a DataGridView
public static Dictionary<string, Type> ColumnTypes(this DataGridView dataGridView,
bool onlyVisible=false)
{
// Identifiers used are:
var types = new Dictionary<string, Type>();
// Go through the columns of the view
foreach (DataGridViewColumn column in dataGridView.Columns)
{
if (onlyVisible == true && column.Visible == true)
{
types[column.HeaderText] = column.ValueType;
}
else if (!onlyVisible)
{
types[Column.HeaderText] = column.ValueType;
}
}
// Return the results
return types;
}
}
public static class DataGridViewRowExtension
{
// Method for: Returning the cells of a row as a List<object>
public static List<object> ToList(this DataGridViewRow dataGridViewRow,
bool onlyVisible= false)
{
// Identifiers used are:
var objectList = new List<object>();
// Go through the row and add the items to the list
foreach (DataGridViewCell cell in dataGridViewRow.Cells)
{
if (onlyVisible == true && cell.Visible == true)
{
objectList.Add(cell.Value);
}
else if (!onlyVisible)
{
objectList.Add(cell.Value);
}
}
// Return the list
return objectList;
}
}
public static class DataTableExtension
{
// Method for: Setting up the column structure of a data table using a dictionary holding column name with data type
public static void SetupColumns(this DataTable dataTable,
Dictionary<string, Type> columns)
{
// Identifiers used are:
int columnCount = columns.Count;
// Set up the structure
foreach (KeyValuePair<string, Type> column in columns)
{
dataTable.Columns.Add(column.Key, column.Value);
}
}
}
虽然这是一个迂回的方式,但你至少可以做到以下几点
string tableName = dataGridView.ToTable().TableName;
当然,这种方式很乏味,但如果您赶时间,它会起作用;如果您需要这些扩展来做其他事情,它会很有用。
我正在使用 entity framework 并像这样填充 gridcontrol;
Models.dbContext ent = new Models.dbContext();
ent.Locations.Load();
gridControl1.DataSource = ent.Locations.Local.ToBindingList();
然后我想Table取个像这样的名字;
DataTable dt = ((DataView)gridview1.DataSource).Table;
Messagebox.Show(dt.TableName);
它给我错误:无法将类型 'System.Data.Entity.Internal.ObservableBackedBindingList`1[Models.Location]' 的对象转换为类型 'System.Data.DataView'.
为什么会这样?我的代码有什么问题?
您可以尝试为 DataGridView 创建扩展方法,以便将其转换为 DataTable:
public static class DataGridViewExtension
{
// Method for: DataGridView to DataTable conversion
public static DataTable ToTable(this DataGridView dataGridView, bool onlyVisible=false)
{
// Identifiers used are:
int rowCount = dataGridView.Rows.Count;
var dataTable = new DataTable();
var columnTypes = new Dictionary<string, Type>();
var rowItems = new List<object>();
// Get the column names and types
columnTypes = dataGridView.ColumnTypes(onlyVisible);
// Setup the DataTable column structure
dataTable.SetupColumns(columnTypes);
// Get the rows of the DataGridView
foreach (DataGridViewRow row in dataGridView.Rows)
{
// Get the row as a list to give to the table
rowItems = row.ToList(onlyVisible);
// Give the row items to the DataTable
dataTable.Rows.Add(rowItems.ToArray());
}
// Return the data table
return dataTable;
}
}
我又做了 3 个扩展,它们是:
public static class DataGridViewExtension
{
// Class for: Getting the column names with column types from a DataGridView
public static Dictionary<string, Type> ColumnTypes(this DataGridView dataGridView,
bool onlyVisible=false)
{
// Identifiers used are:
var types = new Dictionary<string, Type>();
// Go through the columns of the view
foreach (DataGridViewColumn column in dataGridView.Columns)
{
if (onlyVisible == true && column.Visible == true)
{
types[column.HeaderText] = column.ValueType;
}
else if (!onlyVisible)
{
types[Column.HeaderText] = column.ValueType;
}
}
// Return the results
return types;
}
}
public static class DataGridViewRowExtension
{
// Method for: Returning the cells of a row as a List<object>
public static List<object> ToList(this DataGridViewRow dataGridViewRow,
bool onlyVisible= false)
{
// Identifiers used are:
var objectList = new List<object>();
// Go through the row and add the items to the list
foreach (DataGridViewCell cell in dataGridViewRow.Cells)
{
if (onlyVisible == true && cell.Visible == true)
{
objectList.Add(cell.Value);
}
else if (!onlyVisible)
{
objectList.Add(cell.Value);
}
}
// Return the list
return objectList;
}
}
public static class DataTableExtension
{
// Method for: Setting up the column structure of a data table using a dictionary holding column name with data type
public static void SetupColumns(this DataTable dataTable,
Dictionary<string, Type> columns)
{
// Identifiers used are:
int columnCount = columns.Count;
// Set up the structure
foreach (KeyValuePair<string, Type> column in columns)
{
dataTable.Columns.Add(column.Key, column.Value);
}
}
}
虽然这是一个迂回的方式,但你至少可以做到以下几点
string tableName = dataGridView.ToTable().TableName;
当然,这种方式很乏味,但如果您赶时间,它会起作用;如果您需要这些扩展来做其他事情,它会很有用。