DataGridView列不是从Custom DataSource生成的

时间:2015-09-11 16:52:02

标签: c# winforms data-binding datagridview

我编写了一个实现RewriteCond %{THE_REQUEST} \ /+(?!(en|fr|es|de)/).* RewriteRule ^(.*)$ /en/$1 [R,L] 接口的类IBindingListView

BindableList<T> : IBindingListView

由于某些原因_abilityList = new BindableList<Ability>(); dataGridViewAbility.AutoGenerateColumns = true; dataGridViewAbility.DataSource = _abilityList; 没有生成列,因此当我向DataGridView添加数据时,BindableList<T>会抛出一个错误,指出我需要先添加列。

这让我觉得奇怪的是,如果我向我的DataGridView添加一个对象,那么只会生成列。我还为BindableList<T>更改了我的课程,不添加任何内容,列生成就好了。

我不知道为什么BindingList<T>在我的通用绑定列表为空时不会生成列。框架知道程序构建时泛型的类型。

更新:

能力等级

DataGridView

我不明白为什么人们无法理解这一点,但我已经制作了一个新的Winform应用程序仍然存在同样的问题。

class Ability
{
    public Int32 ID { get; set; }
    public Int32 Generation { get; set; }
    public String Name { get; set; }
    public String Effect { get; set; }
}

OnListChanged事件

private BindableList<Ability> _abilityList;

    public Form1()
    {
        InitializeComponent();

        _abilityList = new BindableList<Ability>();

        Button b = new Button();
        b.Location = new Point(0, 0);
        b.Click += new EventHandler(buttonGetData_Click);
        this.Controls.Add(b);

        DataGridView _grid = new DataGridView();
        _grid.Location = new Point(100, 0);
        _grid.AutoGenerateColumns = true;
        _grid.DataSource = _abilityList;
        this.Controls.Add(_grid);
    }

    private void buttonGetData_Click(object sender, EventArgs e)
    {
        _abilityList.Add(new Ability());
    }

当行protected virtual void OnListChanged(ListChangedEventArgs e) { if (ListChanged != null) { ListChanged(this, e); } } 运行时,会触发_abilityList.Add。这将运行并且DataGridView将抛出并将Error,No Columns添加到View。如果我先将ListChanged(this, e);添加到BindableList<T>,然后再将其分配为DataSource列将生成。

1 个答案:

答案 0 :(得分:1)

简单地分配DataGridView.DataSource属性不会立即生成列。根据我的经验,如果您需要立即DataGridViewColumns,那么有4条关键代码行可以强制创建列:

        DataGridView dgv = new DataGridView() { Dock = DockStyle.Fill };
        BindingList<Ability> list = new BindingList<Ability>();
        dgv.AutoGenerateColumns = true;
        dgv.DataSource = list;

        int colCount = dgv.Columns.Count; // 0
        //--------
        // force columns to be created
        using (var g = dgv.CreateGraphics()) {}
        using (var f = new Form()) {
            f.Controls.Add(dgv);
            f.Controls.Remove(dgv);
        }
        //--------
        int colCount2 = dgv.Columns.Count; // 4

修改:更快的替代方法,尤其是当DataGridViewColumns(例如AutoSizeModeSortMode)上的属性需要设置时。

public static void Refresh(DataGridView view, DataTable table) {
    bool origAuto = view.AutoGenerateColumns;
    view.AutoGenerateColumns = true;
    view.DataSource = table;
    view.BindingContext = new BindingContext();
    view.AutoGenerateColumns = origAuto;
}
相关问题