C#: 使用代码向绑定的DataGridView添加列

4

// 从这个 Admin 类获取数据:

public static IQueryable<Student> GetStudents()
{
    DojoDBDataContext conn = new DojoDBDataContext();

    var query =
        from s in conn.Students
        join b in conn.Belts on s.BeltID equals b.ID
        orderby s.LastName ascending
        select s;

    return query;
}

// 在我的表单上:

BindingSource bs = new BindingSource();

    private void fillStudentGrid()
    {
        bs.DataSource = Admin.GetStudents();
        dgViewStudents.DataSource = bs;
        dgViewStudents.Columns.Remove("ID");
    }

这段代码本身没有问题,但是我不想删除超过20列的数据,我只想添加一些需要的列。此外,给列标题命名也是一个额外的好处。但是,我发现添加方法对我来说并不起作用:

private void fillStudentGrid()
{
    bs.DataSource = Admin.GetStudents();

    dgViewStudents.AutoGenerateColumns = false;
    dgViewStudents.DataSource = bs;
    dgViewStudents.Columns.Add("ID", "ID Number");
}

我得到了适当数量的行,列标题也正确设置了...但是这些行被填充了空白数据。

1
实际上,即使使用第一个fillStudentGrid()代码,它也不能正确返回conn.Belts的属性。我可以通过使用lambda将linq查询放在表单中来使其工作,但我试图保持数据逻辑分离。 - mdvaldosta
3个回答

8

如果您看到没有数据,那是因为您实际上没有将该列绑定到任何内容。所需行数由绑定确定,网格知道如果有任何列,则每个数据项需要一行,但如果没有列,则不显示任何内容。当您添加新列时,它将出现在所有行中,但它不会自动绑定到您的数据源。要做到这一点,您需要在将其添加到集合之前设置列上的DataPropertyName:

bs.DataSource = Admin.GetStudents();
dgViewStudents.AutoGenerateColumns = false;
dgViewStudents.DataSource = bs;

DataGridViewColumn col = new DataGridViewTextBoxColumn();
col.DataPropertyName = "ID";
col.HeaderText = "ID Column";
col.Name = "foo";
dgViewStudents.Columns.Add(col);

1
学生类的属性也可以像这样重新设计。使用browsable false选项,您不需要删除gridview列。
    using System.ComponentModel;

    [Browsable(false)]
    [Description("Öğrenci kayıt numarası")]
    [DisplayName("Öğrenci Kayıt No")]
    public int StudentID { get; set; }

0

即使列不存在,您也可以向查询中添加列。

例如:从表名选择员工ID、员工姓名和0作为薪水,并将其绑定到您的DataGridView。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接