2012-02-17 83 views
4

我建立了我的綁定源數據網格:如何在排序後在給定位置上的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

類似的問題,刪除在pos銀行足球比賽X - 這是在這裏 >> stack overflow question

使用bs.insert(0,newRow)的想法解決,但它說,外部對象不能被添加到這個列表

如何BindingSource的給定位置排序後添加行?

+0

我不認爲有直接的方法來做到這一點。我能想到的唯一想法是添加一列,然後填充它,以便排序工作。 – 2012-02-21 01:14:45

回答

1

這是一個解決方案,用於添加到列表的頂部 - 我不知道它是否是最好的解決方案,但它的工作原理。還有很多其他方法可以解決這個問題,其中包括製作自己的綁定集合以允許插入到已排序列表中,這可以使代碼形成某些觀點,但這至少很簡單。

這裏是代碼,其中包括創建一個數據表。

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, "Baggins", "Frodo", "Baggins, Frodo", "Bagshot Row #2", "Hobbiton", "SH", "00001", "555-1111", DateTime.Parse("9/9/2008"), 1, false); 
     dt.Rows.Add(6, "Bolger", "Fatty", "Bolger, Fatty", "ProudFeet Creek", "Hobbiton", "SH", "00001", "555-1111", DateTime.Parse("9/9/2008"), 1); dt.Rows.Add(4, "Elessar", "Aragorn", "Elessar, Aragorn", "Citadel", "Minas Tirith", "Gondor", "00000", "555-0000", DateTime.Parse("9/9/2008"), 4, false); 
     dt.Rows.Add(5, "Evenstar", "Arwin", "Evenstar, Arwin", "Citadel", "Minas Tirith", "Gondor", "00000", "555-0001", DateTime.Parse("9/9/2008"), 4, false); 
     dt.Rows.Add(3, "Greyhame", "Gandalf", "Grayhame, Gandalf", DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, 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", "Bilbo", "Baggins, Bilbo", "Bagshot Row #1", "Hobbiton", "SH", "00001", "555-2222", DateTime.Parse("9/9/2008"), 1, 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來,使我們能夠進行排序基於行是否是新的或不DataTable中的數據表。結合抓取DataGridView中的排序列,可以保留舊的排序順序並保持新行的位置。

+0

使東西不可見並不像刪除它們那樣高效,所以試圖通過刪除行來解決它,而不是使它們不可見 – 2012-04-02 20:09:15

相關問題