Datagridview / BindingSource并排序:在列表末尾添加记录

时间:2010-01-21 22:16:05

标签: c# datagridview

这将是一个愚蠢的问题,但我有一个带有BindingSource作为数据源的datagridview。

bindingSources.Datasource是一个拥有排序支持的自己的BindingList。这一切都有效。

但是当记录将被插入到排序列表中时,它将被放置在datagridiview的末尾。刷新后(单击鼠标的示例),记录将放在正确的位置。

所以,我认为我忘了要实现或调用以确保插入的记录将直接显示在datagridview的正确位置。

谁可以帮我提示。

感谢。

3 个答案:

答案 0 :(得分:1)

我使用以下代码。

请原谅粗略的代码 - 我只是展示关键部分,但如果您需要,我可以提供更完整的示例。

我有一个SortableBindingList _names,它绑定到我的DataGridView。然后在我的表单上我有一个按钮,在Click偶然处理程序中添加了一个新名称。这可以在 joe pete 之间添加名称​​ kevin

private SortableBindingList<Names> _names;

public Form1()
{
    InitializeComponent();

    _names = new SortableBindingList<Names>();
    _names.Add(new Names() { Name = "joe" });
    _names.Add(new Names() { Name = "pete" });

    DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn();
    col1.DataPropertyName = "Name";

    dataGridView1.Columns.Add(col1);

    dataGridView1.DataSource = _names;            
}

private void button1_Click(object sender, EventArgs e)
{             
   _names.Add(new Names(){Name = "kevin"});
   dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Descending);
} 


public class Names
{
    public string Name { get; set; }
}

所以关键是我在添加到列表后对dataGridView进行排序。

我本可以在.Sort()调用中提供IComparer - 默认比较器只是在.ToString()上进行比较

有趣的是,在我的示例中,插入项目时还可以使用以下内容:

private void button1_Click(object sender, EventArgs e)
{             
   //_names.Add(new Names(){Name = "kevin"});
   _names.Insert(1, new Names() { Name = "kevin" });
   // dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Descending);
}

只需将项目插入正确的位置就足以使网格显示正确排序的列表。我正在使用与您相同的SortableBindingList,如MartinWilley.com所示。

你的问题可能是你正在添加而不是插入吗?

答案 1 :(得分:0)

也许尝试处理BindingSource.ListChanged事件?

答案 2 :(得分:0)

此代码段效果非常好,并且对于大多数用途来说足够快......

int iColNumber = 3;  //e.g., sorting on the 3rd column of the DGV

MyBindingSource.DataSource = MyBindingList.OrderByDescending(o => o.GetType().GetProperty(MyDataGridView.Columns[iColNumber].Name).GetValue(o));