这将是一个愚蠢的问题,但我有一个带有BindingSource作为数据源的datagridview。
bindingSources.Datasource是一个拥有排序支持的自己的BindingList。这一切都有效。
但是当记录将被插入到排序列表中时,它将被放置在datagridiview的末尾。刷新后(单击鼠标的示例),记录将放在正确的位置。
所以,我认为我忘了要实现或调用以确保插入的记录将直接显示在datagridview的正确位置。
谁可以帮我提示。
感谢。
答案 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));