【问题标题】:How to get TableName from gridview?如何从 gridview 中获取 TableName?
【发布时间】:2019-01-13 10:58:40
【问题描述】:

我正在使用实体框架,我像填充网格控件一样;

  Models.dbContext ent = new Models.dbContext();      
  ent.Locations.Load();
  gridControl1.DataSource = ent.Locations.Local.ToBindingList();

然后我正在尝试获取类似的表名;

 DataTable dt = ((DataView)gridview1.DataSource).Table;
 Messagebox.Show(dt.TableName);

它给了我错误:无法将类型为“System.Data.Entity.Internal.ObservableBackedBindingList`1[Models.Location]”的对象转换为类型“System.Data.DataView”。

为什么会这样?我的代码有什么问题?

【问题讨论】:

  • gridControl1.DataSource = ent.Locations.Local.ToBindingList(); 你设置了DataSource TOBINGINGLIST 然后期望从DataSource 得到DataView。 BindingList != 数据视图
  • 现在我看到了,但这是我第一次使用BindingLists,在这种情况下如何获取TableName?
  • 您可以将表名存储在Tag 属性或Table
  • 来自 BindingList - 不可能完成的任务。将表名存储在其他地方
  • 所以,我必须了解更多关于列表的信息。非常感谢

标签: c# entity-framework devexpress devexpress-gridcontrol


【解决方案1】:

您可以尝试为 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;

当然,这种方式很乏味,但如果你赶时间,它会起作用,如果你需要这些扩展来做其他事情,它会很有用。

【讨论】:

    猜你喜欢
    • 2022-06-24
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多