Я борюсь с 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
}
}