微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在排序后在给定位置的bindingsource中添加一行? C#

我使用绑定源构建我的数据网格:

sqlDataAdapter adapter = new sqlDataAdapter(Datenbank.cmd);
    dataSet1.Tables.Clear();
    adapter.Fill(dataSet1,"Table");
    bs = new BindingSource();
    bs.DataSource = dataSet1.Tables["Table"];
    dataGridView1.DataSource = bs;

现在我对它进行排序:

bs.sort = "customer DESC";

现在我想在0处添加新行

dataSet1.Tables[0].Rows.InsertAt(newRow,0);

但是,它不会插入位置0

删除位置x的类似问题 – 这里已经解决
>> stack overflow question

想到使用bs.insert(0,newRow),但它说外部对象无法添加到此列表中

如何在排序后在给定位置的bindingsource中添加一行?

解决方法

这是一个解决方案,可以添加到列表的顶部 – 我不知道它是否是最好的解决方案,但它的工作原理.有很多其他方法可以解决这个问题,包括制作允许插入排序列表的自己的绑定集合,从而可以从某些观点提供更好的代码,但这至少很简单.

这是代码,包括创建数据表.

public partial class Form1 : Form
{
    BindingSource bs;
    DataTable dt;
    public Form1()
    {
        InitializeComponent();

        dt = new DataTable("Customers");
        DataColumn dc;

        dc = new DataColumn();
        dc.DataType = typeof(int);
        dc.ColumnName = "CustomerID";

        dt.Columns.Add(dc);
        dt.Columns.Add(new DataColumn("LastName"));
        dt.Columns.Add(new DataColumn("FirstName"));
        // Concatenation of first and last names 
        dt.Columns.Add(new DataColumn("FullName"));
        dt.Columns.Add(new DataColumn("Address"));
        dt.Columns.Add(new DataColumn("City"));
        dt.Columns.Add(new DataColumn("State"));
        dt.Columns.Add(new DataColumn("Zip"));
        dt.Columns.Add(new DataColumn("Phone"));

        dc = new DataColumn();
        dc.DataType = typeof(DateTime);
        dc.ColumnName = "LastPurchaseDate";
        dt.Columns.Add(dc);

        dc = new DataColumn();
        dc.DataType = typeof(int);
        dc.ColumnName = "CustomerType";
        dt.Columns.Add(dc);
        dt.Columns.Add("HiddenSort",typeof(bool));

        // Populate the table 
        dt.Rows.Add(2,"Baggins","Bilbo","Baggins,Bilbo","Bagshot Row #1","Hobbiton","SH","00001","555-2222",DateTime.Parse("9/9/2008"),1,false);
        dt.Rows.Add(1,"Frodo",Frodo","Bagshot Row #2","555-1111",false);
        dt.Rows.Add(6,"Bolger","Fatty","Bolger,Fatty","ProudFeet Creek",1); dt.Rows.Add(4,"Elessar","aragorn","Elessar,aragorn","Citadel","Minas Tirith","Gondor","00000","555-0000",4,false);
        dt.Rows.Add(5,"Evenstar","Arwin","Evenstar,Arwin","555-0001",false);
        dt.Rows.Add(3,"Greyhame","Gandalf","Grayhame,Gandalf",dbnull.Value,3,false);

        BindingSource bs = new BindingSource();
        bs.DataSource = dt;

        dataGridView1.DataSource = bs;
        dataGridView1.Columns["HiddenSort"].Visible = false;
        dataGridView1.sorted += new EventHandler(dataGridView1_Sorted);
    }

    void dataGridView1_Sorted(object sender,EventArgs e)
    {
        foreach (DaTarow dr in dt.Rows)
        {
            dr["HiddenSort"] = false;
        }
    }

    private void button1_Click(object sender,EventArgs e)
    {

        DaTarow dr = dt.Rows.Add(2,"Testing",true);
        DataView dv = dt.defaultview;
        if (dataGridView1.sortedColumn == null)
        {
            dv.sort = "[HiddenSort] desc";
        }
        else
        {
            string sortname = dataGridView1.sortedColumn.Name;

            dv.sort = "[HiddenSort] desc,[" + sortname + "] asc";
        }
    }

}

这里的技巧是向数据表中添加一个新列HiddenSort,它允许我们根据行是否为新来对数据表进行排序.再加上从DataGridView中获取sort列,可以保留旧的排序顺序并保持新行的位置.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐