填充datagridview:foreach与数据源绑定

时间:2017-12-13 19:05:15

标签: c# winforms datagridview

直到知道我使用if (f.range.getColumn() == 30 && f.range.getDisplayValue() == "HIDE") 从我的存储库项目返回值以从sql server检索值。

但我已经阅读并了解到最好使用DTO作为返回值。

填充datagridview的更有效方法是什么,因为现在我有一个类列表作为源。

我是否应该在列表中使用foreach循环并手动添加行或从列表中创建数据表并将其绑定到datagridview?

更新: 例如,我有一个类Datatable列表,Id和Name列为属性。我想只显示名称。我无法直接绑定列表。所以我需要一个数据表。

现在效率更高。创建这个数据表并绑定它,或者用foreach循环直接填充datagridview吗?

2 个答案:

答案 0 :(得分:1)

您只能显示您要绑定的列表的一部分

using System.Collections.Generic;
using System.Windows.Forms;

namespace datagridview_47800424
{
    public partial class Form1 : Form
    {
        List<dgventry> dgvsource = new List<dgventry>();
        DataGridView dgv = new DataGridView();
        public Form1()
        {
            InitializeComponent();
            ourinit();
        }

        private void ourinit()
        {

            //lets create some records in that list
            for (int i = 0; i < 10; i++)
            {
                dgvsource.Add(new dgventry { name = $"name {i}", id = i });
            }


            dgv.AutoGenerateColumns = false;//don't auto create the columns
            DataGridViewColumn dgvcol = new DataGridViewTextBoxColumn();//make your own
            dgvcol.DataPropertyName = "name";//set which property to bind to
            dgv.Columns.Add(dgvcol);//add the col to the grid


            dgv.DataSource = dgvsource;//bind the grid to your list

            this.Controls.Add(dgv);//add the grid to the form
            dgv.Dock = DockStyle.Fill;//just need to position it somehow and this is quick

        }
    }


    public class dgventry
    {
        public string name { get; set; }
        public int id { get; set; }
    }
}

答案 1 :(得分:0)

我做了一些基准测试。

最快的方法是使用datareader从数据库中读取数据,然后创建类列表。 之后,将列表直接绑定到datagridview,并选择要显示的列,如blaze所述。

麻烦的是datagridview无法绑定子对象属性。

一个技巧是实现一个公共属性来获取子类属性,并在列的DataPropertyName中使用此属性。

这种方式比foreach循环快5到6倍,比使用数据表快一点。

希望得到这个帮助,非常感谢您的建议。

public class SubDTO
{
    public int Id { get; set; }
    public string Label { get; set; }
}
public class DTO
{
    public int SubDtoId
    {
        get
        {
            return SubDTO.Id;
        }
    }
    public string SubDtoLabel
    {
        get
        {
            return SubDto.Label;
        }
    }
    public string Caract { get; set; }
    public string Serial { get; set; }
    public string Comment { get; set; }
    public SubDTO SubDTO { get; set; }
}

填充datagridview的代码

    public Fill()
    {
        InitializeComponent();

        dataGridView1.AutoGenerateColumns = false;

        DataGridViewColumn dgvcol = new DataGridViewTextBoxColumn();
        dgvcol.DataPropertyName = "SubDtoId";
        dataGridView1.Columns.Add(dgvcol);

        dgvcol = new DataGridViewTextBoxColumn();
        dgvcol.DataPropertyName = "SubDtoLabel";
        dataGridView1.Columns.Add(dgvcol);

        dgvcol = new DataGridViewTextBoxColumn();
        dgvcol.DataPropertyName = "Caract";
        dataGridView1.Columns.Add(dgvcol);
        dgvcol = new DataGridViewTextBoxColumn();
        dgvcol.DataPropertyName = "Serial";
        dataGridView1.Columns.Add(dgvcol);
        dgvcol = new DataGridViewTextBoxColumn();
        dgvcol.DataPropertyName = "Comment";
        dataGridView1.Columns.Add(dgvcol);


        dataGridView1.DataSource = ListOfClasses();

    }

    public List<DTO> ListOfClasses()
    {
     //Sql query to return the List of DTO
    }