Как добавить строку в bindingsource на заданную позицию после сортировки?C # - PullRequest
4 голосов
/ 18 февраля 2012

Я строю свою сетку данных с источником привязки:

    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 - которая была решена здесь >> Вопрос переполнения стека

думалиспользования bs.insert(0,newRow), но он говорит, что внешние объекты не могут быть добавлены в этот список

Как добавить строку в bindingsource на заданную позицию после сортировки?

1 Ответ

1 голос
/ 28 марта 2012

Вот решение, которое работает для добавления в начало списка - я понятия не имею, является ли это лучшим решением, но оно работает.Существует множество других способов решения этой проблемы, включая такие, как создание собственной коллекции привязок, которая позволяет вставлять в отсортированный список, что может дать коду лучше форму определенных точек зрения, но это по крайней мере просто.

Вот код, который включает в себя создание таблицы данных.

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 к таблице данных, который позволяет нам сортировать данные на основестрока новая или нет.Это в сочетании с захватом столбца сортировки из DataGridView позволяет сохранить старый порядок сортировки и сохранить положение новых строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...