2011-12-01 62 views
1

我有一个从DataGridView继承的自定义控件。它通过一些附加功能(其导出每个单元的内容)来增强控制。我想使用此功能,但不需要网格本身的用户界面。数据绑定不在Form.Controls集合中的DataGridView控件?

因此,我创建了自定义控件的实例,将DataSource属性设置为DataTable的实例,并且在网格中没有列。我的数据表具有列(和行),AutoGenerateColumns为true,但没有列出现在网格“Columns”集合中。自定义控件在此处变得无关紧要,因为DataGridView控件的功能相同。

如果我将网格添加到窗体的“控件”集合,数据绑定工作,网格有我的列。

这是为什么?

public Form1() 
    { 
    InitializeComponent(); 

    DataTable dataTable = new DataTable() { TableName = "Bob" }; 
    dataTable.Columns.Add("One",typeof(String)); 
    dataTable.Columns.Add("Two", typeof(String)); 
    dataTable.Columns.Add("Three", typeof(String)); 
    dataTable.Rows.Add("a", "b", "c"); 
    dataTable.Rows.Add("d", "e", "f"); 
    dataTable.Rows.Add("g", "h", "i"); 

    DataGridView grid = new DataGridView(); 

    grid.DataSource = dataTable; 
    int n1 = grid.Columns.Count; // returns zero 

    this.Controls.Add(grid); // why do I have to do this ? 

    grid.DataSource = null; 
    grid.DataSource = dataTable; 
    int n2 = grid.Columns.Count; // returns three 
    } 

感谢, 罗斯

+0

可能的重复[为什么我必须添加一个DataGridView到一个窗体以获取数据?](http://stackoverflow.com/questions/8256762/why-must-i-add-a-datagridview-to -a-form-in-order-to-the-data) –

+0

是的......它似乎是这个问题的重复。然而,只要阅读grid *的“Handle”属性*(如该帖子的回答中所建议的那样)*似乎不会影响绑定列*(在本例中)*。 –

+0

是的 - 我自己尝试过,不能使它工作。就我个人而言,我会退后一步,重新考虑使用UI组件来处理非UI工作。是否有可能提取您的逻辑来处理数据源而不是单元集合? –

回答

3

大卫·霍尔的评论使我here,害得我寻找到电网的BindingContext中。果然,它是空的,但通过为网格控件创建一个新的BindingContext,将网格绑定到DataTable现在填充“Columns”集合。

public Form1() 
    { 
    InitializeComponent(); 

    DataTable dataTable = new DataTable() { TableName = "Bob" }; 
     : 

    DataGridView grid = new DataGridView { Name = "Tom" }; 

    grid.BindingContext = new BindingContext(); 
    grid.DataSource = dataTable; 

    int n1 = grid.Columns.Count; // returns three 
    } 

奇怪的是,在其中设置的结合上下文或数据源中的顺序似乎已经不重要了!