private void Form_Load(object sender, EventArgs e)
{
BindingList<DataInfo> data = new BindingList<DataInfo>();
for (int x = 1; x <= 100; x++)
{
data.Add(new DataInfo()
{
id = x,
Name = $"User{x}"
});
}
this.bindingSource1.DataSource = data;
this.dataGridView1.DataSource = bindingSource1;
}
private void button1_Click(object sender, EventArgs e)
{
bindingSource1.MoveLast();
}
}
public class DataInfo
{
public int id { get; set; }
public string Name { get; set; }
}
class CustomerComparer<Tproperty> : Comparer<Customer>
{
public bool EmptyRowsFirst {get; set;} = true;
// sort the non-empty customers ascending or descending:
public SortDirection SortDirection {get; set;} = SortDirection.Ascending;
// which property to use to sort the non-empty customers:
public Func<Customer, TProperty> PropertySelector
public override int Compare (Customer x, Customer y)
{
if (this.EmptyRowsFirst)
{
if (x.IsEmpty)
return y.IsEmpty ? 0 : +1
else
return y.IsEmpty ? -1 : this.CompareByProperty;
}
else
return this.CompareByProperty;
}
}
3条答案
按热度按时间vaqhlq811#
没有办法将添加新行移动到数据网格视图的顶部。有一个名为bindingSource的控件,它有像MoveLast这样的方法,可以更容易地导航到最后一行数据。
n6lpvg4x2#
请注意“空行”和“添加新行”之间的区别,后者看起来是空行,但实际上还不是数据的一部分。
顶部为真实的的空行
假设我们的DataGridView显示了一系列Customers的几个属性。
要使空行位于顶部,您必须定义“Empty row”:
问题,问题。显然你需要用属性IsEmpty来扩展你的客户:
为了进行排序以使Empty Customers位于顶部,您需要创建一个CustomerComparer类(一个实现
IComparer<Customer>
的类),并告诉DataGridView使用此比较器进行排序:客户比较器类的示例:
按属性比较的方法:
用法:
yhxst69z3#
可以创建一个空的DataGridView(Dgv),并可以添加新数据。
Dgv的典型代码是(考虑到BindingSourceOject被分配给ContextObject.DataSource):
如果不加载DBSet(删除第一行),Dgv将显示为空,但连接到DBSetObject。它将只显示数据输入行。添加新行时将显示在此处。
孔数据处理表单的解决方案是在其上放置两个Dgv。第一个是如上所述的“空”,用于添加数据,另一个没有数据条目(AllowUserToAddRows = false),用于查看/编辑现有数据。
这个解决方案让我们不必创建一组控件来添加数据,两个Dgv可以共享相同的事件处理程序来进行数据验证、格式化等。