Программное добавление объекта и выбор соответствующей строки не превращает ее в CurrentRow.

Я борюсь с DataGridView: у меня есть BindingList некоторых простых объектов, реализующих INotifyPropertyChanged. Источник данных DataGridView установлен на этот BindingList. Теперь мне нужно добавить объект в список, нажав клавишу «+». Когда объект добавлен, он должен появиться как новая строка и стать текущей строкой. Поскольку свойство CurrentRow доступно только для чтения, я перебираю все строки, проверяю, является ли связанный с ним элемент вновь созданным объектом, и если это так, я устанавливаю для этой строки значение «Selected = true;».

Проблема: хотя новый объект и, следовательно, новая строка вставляются и выбираются в DataGridView, это все равно не CurrentRow! Он не станет CurrentRow, если я не щелкну мышью в этой новой строке.

В этой тестовой программе вы можете добавлять новые объекты (и, следовательно, строки) с помощью клавиши «+», а с помощью клавиши «i» привязанный к данным объект CurrentRow отображается в MessageBox.

Как я могу сделать только что добавленный объект CurrentObject? Спасибо за вашу помощь!

Вот образец:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        BindingList<item> myItems;

        public Form1()
        {
            InitializeComponent();
            myItems = new BindingList<item>();

            for (int i = 1; i <= 10; i++)
            {
                myItems.Add(new item(i));
            }

            dataGridView1.DataSource = myItems;
        }

        public void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Add)
            {
                addItem();
            }
        }

        public void addItem()
        {
            item i = new item(myItems.Count + 1);
            myItems.Add(i);
            foreach (DataGridViewRow dr in dataGridView1.Rows)
            {
                if (dr.DataBoundItem == i)
                {
                    dr.Selected = true;
                }
            }
        }

        private void btAdd_Click(object sender, EventArgs e)
        {
            addItem();
        }

        private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Add)
            {
                addItem();
            }
            if (e.KeyCode == Keys.I)
            {
                MessageBox.Show(((item)dataGridView1.CurrentRow.DataBoundItem).title);
            }
        }
    }

    public class item : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private int _id;
        public int id {
            get
            {
                return _id;
            }
            set
            {
                this.title = "This is item number " + value.ToString();
                _id = value;
                InvokePropertyChanged(new PropertyChangedEventArgs("id"));
            }
        }

        private string _title;
        public string title {
            get
            {
                return _title;
            }
            set
            {
                _title = value;
                InvokePropertyChanged(new PropertyChangedEventArgs("title"));
            }
        }

        public item(int id)
        {
            this.id = id;
        }

        #region Implementation of INotifyPropertyChanged
        public void InvokePropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, e);
        }

        #endregion
    }
}

person Rob    schedule 28.10.2013    source источник
comment
Вы должны установить для свойства CurrentCell некоторую ячейку в желаемой строке с фокусом. Как dataGridView1.CurrentCell = dr.Cells [myID]   -  person Ralf    schedule 28.10.2013
comment
Спасибо, Ральф, вот и все.   -  person Rob    schedule 28.10.2013


Ответы (1)


Я нашел ответ в этой статье: http://www.c-sharpcorner.com/Forums/Thread/43898/

Выделить строку недостаточно, вы должны установить CurrentCell, чтобы строка стала CurrentRow. Итак, чтобы приведенный выше код работал, вам нужно изменить это:

    public void addItem()
    {
        item i = new item(myItems.Count + 1);
        myItems.Add(i);
        foreach (DataGridViewRow dr in dataGridView1.Rows)
        {
            if (dr.DataBoundItem == i)
            {
                dr.Selected = true;
            }
        }
    }

к этому:

    public void addItem()
    {
        item i = new item(myItems.Count + 1);
        myItems.Add(i);
        foreach (DataGridViewRow dr in dataGridView1.Rows)
        {
            if (dr.DataBoundItem == i)
            {
                dr.Selected = true;
                dataGridView1.CurrentCell = dr.Cells[0];
            }
        }
    }
person Rob    schedule 28.10.2013