winforms c# datagridview在顶部设置新行位置

lstz6jyr  于 2023-02-19  发布在  C#
关注(0)|答案(3)|浏览(364)

有什么方法可以设置DataGridView顶部的最后一个空行吗?滚动到最后一行以添加新行会使大型数据集烦恼。

vaqhlq81

vaqhlq811#

没有办法将添加新行移动到数据网格视图的顶部。有一个名为bindingSource的控件,它有像MoveLast这样的方法,可以更容易地导航到最后一行数据。

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; }
}
n6lpvg4x

n6lpvg4x2#

请注意“空行”和“添加新行”之间的区别,后者看起来是空行,但实际上还不是数据的一部分。

顶部为真实的的空行

假设我们的DataGridView显示了一系列Customers的几个属性。
要使空行位于顶部,您必须定义“Empty row”:

  • 该行是否每个显示的Customer属性都具有空值?
  • 还是应该检查所有Customer属性,甚至是未显示的属性?
  • 那么值类型呢?什么时候它们被认为是空的?如果它们的值为0?
  • 那么显示的DateTime又如何呢?

问题,问题。显然你需要用属性IsEmpty来扩展你的客户:

public bool IsEmpty => ... // TODO code that returns true if customer is "Empty".

为了进行排序以使Empty Customers位于顶部,您需要创建一个CustomerComparer类(一个实现IComparer<Customer>的类),并告诉DataGridView使用此比较器进行排序:

IComparer<Customer> customerComparer = ...
this.DataGridView1.Sort(customerComparer);

客户比较器类的示例:

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;
    }
}

按属性比较的方法:

private int CompareByProperty(Customer x, Customer y)
{
    IComparer<TProperty> propertyComparer = Comparer<T>.Default;
    TProperty propertyX = this.PropertySelector(x);
    TProperty propertyY = this.PropertySelector(y);
    int compareResult = propertyComparer(propertyX, propertyY);
    if (this.SortDirection == SortDirection.Descending)
        compareResult = -compareResult;
    return compareResult;
}

用法:

// Sort by Customer.BirthDay, Ascending, empty rows First:
IComparer<Customer> customerComparer = new CustomerComparer<DateTime>
{
     EmptyRowsFirst = true,
     SortDirection = SortDirection.Ascending,
     customer => customer.BirthDay,
};
this.DataGridView.Sort(customerComparer);

// Sort by Customer.City, rest as default:
IComparer<Customer> customerComparer = new CustomerComparer<String>
{
     customer => customer.City,
};
this.DataGridView.Sort(customerComparer);
yhxst69z

yhxst69z3#

可以创建一个空的DataGridView(Dgv),并可以添加新数据。
Dgv的典型代码是(考虑到BindingSourceOject被分配给ContextObject.DataSource):

ContextObject.DBSetObject.Load();
    BindingSourceOject.DataSource = ContextObject.DBSetObject.Local.ToBindingList();

如果不加载DBSet(删除第一行),Dgv将显示为空,但连接到DBSetObject。它将只显示数据输入行。添加新行时将显示在此处。
孔数据处理表单的解决方案是在其上放置两个Dgv。第一个是如上所述的“空”,用于添加数据,另一个没有数据条目(AllowUserToAddRows = false),用于查看/编辑现有数据。
这个解决方案让我们不必创建一组控件来添加数据,两个Dgv可以共享相同的事件处理程序来进行数据验证、格式化等。

相关问题