Строка MoveUp / MoveDown не работает после сортировки столбца datagridview

У меня есть следующий DataGridView, связанный с bindingSource:

bindingSource1.DataSource = dataset1;
bindingSource1.DataMember = "table1";
dataNavigator1.DataSource = bindingSource1;
dataGridView1.DataSource = bindingSource1;

И у меня есть две функции для перемещения вверх и вниз по выбранной строке:

private void buttonUp_Click(object sender, EventArgs e)
{
    int index = this.bindingSource1.Position;

    if (index > 0)
    {
        DataRow dr = (DataRow)this.dataset1["table1"].Rows[index];
        DataRow newDr = this.dataset1["table1"].NewRow();
        newDr.ItemArray = dr.ItemArray;
        this.dataset1["table1"].Rows.RemoveAt(index);
        this.dataset1["table1"].Rows.InsertAt(newDr, index - 1);
        this.bindingSource1.Position = index - 1;
    }
}

private void buttonDown_Click(object sender, EventArgs e)
{
    int index = this.bindingSource1.Position;

    if (index < this.bindingSource1.Count)
    {
        DataRow dr = (DataRow)this.dataset1["table1"].Rows[index];
        DataRow newDr = this.dataset1["table1"].NewRow();
        newDr.ItemArray = dr.ItemArray;
        this.dataset1["table1"].Rows.RemoveAt(index);
        this.dataset1["table1"].Rows.InsertAt(newDr, index + 1);
        this.bindingSource1.Position = index + 1;
    }
}

Оба метода работают нормально, и когда я нажимаю кнопку, чтобы переместить строку, она перемещается правильно.

Но если я щелкну до этого столбца, чтобы отсортировать его (щелкните заголовок), и после попытки снова переместить строку, позиция источника привязки будет перемещена, а строка в datagridview - нет. Я отлаживаю функции, и все идет не так, похоже, просто ошибка визуализации datagridview. Я попытался расширить сортировку источника привязки в обработанном событии dataGridView1_Sorted, но все еще не работает. Почему строка не перемещается после операции сортировки в datagridview?

благодаря. -Алессандро

Я добился некоторого прогресса, но все еще есть некоторые проблемы после сортировки, щелкнув столбец сетки заголовка. Пробовал сбросить bindingSource1.Sort = ""; в функции перемещения строк, и строка, а теперь и строка перемещаются, но позиция неправильная !! Вот код, чтобы вы попробовали сами ..

public partial class Form1 : Form
{
    DataTable dt;
    DataSet ds = new DataSet();

    public Form1()
    {
        InitializeComponent();
        dt = new DataTable("table1");
        dt.Columns.Add("Column1", typeof(int));
        dt.Columns.Add("Column2", typeof(int));
        dt.Columns.Add("Column3", typeof(int));
        dt.Rows.Add(1, 0, 0);
        dt.Rows.Add(2, 1, 1);
        dt.Rows.Add(2, 0, 0);
        dt.Rows.Add(3, 1, 1);
        dt.Rows.Add(3, 0, 4);
        dt.Rows.Add(3, 3, 4);
        ds.Tables.Add(dt);

        bindingSource1.DataSource = ds.Tables[0];
        this.dataGridView1.DataSource = bindingSource1;
    }

    private void dataGridView1_Sorted(object sender, EventArgs e)
    {
        //force the BindingSource to reflect the same sort order as the DataGridView
        String sort = dataGridView1.SortedColumn.DataPropertyName;

        if (dataGridView1.SortOrder == SortOrder.Descending)
        {
            sort = sort + " DESC";
        }

        //ds.Tables["table1"].DefaultView.Sort = sort;
        bindingSource1.Sort = sort;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        bindingSource1.Sort = "";
        //ds.Tables[0].DefaultView.Sort = "";

        int index = this.bindingSource1.Position;

        if (index > 0)
        {
            DataRow dr = (DataRow)this.ds.Tables["table1"].Rows[index];
            DataRow newDr = this.ds.Tables["table1"].NewRow();
            newDr.ItemArray = dr.ItemArray;
            this.ds.Tables["table1"].Rows.RemoveAt(index);
            this.ds.Tables["table1"].Rows.InsertAt(newDr, index - 1);
            this.bindingSource1.Position = index - 1;
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        bindingSource1.Sort = "";
        int index = this.bindingSource1.Position;

        if (index < this.bindingSource1.Count)
        {
            DataRow dr = (DataRow)this.ds.Tables["table1"].Rows[index];
            DataRow newDr = this.ds.Tables["table1"].NewRow();
            newDr.ItemArray = dr.ItemArray;
            this.ds.Tables["table1"].Rows.RemoveAt(index);
            this.ds.Tables["table1"].Rows.InsertAt(newDr, index + 1);
            this.bindingSource1.Position = index + 1;
        }
    }
} 

person Alessandro    schedule 06.06.2011    source источник
comment
Пожалуйста, найдите хотя бы время и удалите все лишние пустые строки самостоятельно в следующий раз.   -  person H.B.    schedule 06.06.2011
comment
И ваш вопрос в чем? Или краткий ответ: Yes.   -  person Bobby    schedule 06.06.2011


Ответы (1)


Добавьте DataBind () к событиям onSorted и onPagedChanged сетки.

person MAW74656    schedule 06.06.2011
comment
winform datagridview не имеет метода DataBind (). - person Alessandro; 06.06.2011
comment
Простите меня. Я, должно быть, пропустил это. Определяет ли OP winforms? - person MAW74656; 06.06.2011