直到知道我使用if (f.range.getColumn() == 30 && f.range.getDisplayValue() == "HIDE")
从我的存储库项目返回值以从sql server检索值。
但我已经阅读并了解到最好使用DTO作为返回值。
填充datagridview的更有效方法是什么,因为现在我有一个类列表作为源。
我是否应该在列表中使用foreach循环并手动添加行或从列表中创建数据表并将其绑定到datagridview?
更新:
例如,我有一个类Datatable
列表,Id和Name列为属性。我想只显示名称。我无法直接绑定列表。所以我需要一个数据表。
现在效率更高。创建这个数据表并绑定它,或者用foreach循环直接填充datagridview吗?
答案 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
}