Этот вопрос, кажется, состоит из двух частей:
- Как общаться между двумя формами окон
- Как изменить выбранную строку в сетке данных
Есть множество разных способов решения обеих задач, поэтому я просто дам вам два, которые будут работать. Первый (для оконных форм) является самым простым, а второй (для изменения выбранной строки), по моему мнению, является правильным методом.
Связь между окнами форм
Самый простой способ связи между двумя формами окон - передать ссылку на одну форму в другую форму.
Допустим, у вас есть Form1, которая открывает Form2, вы можете сделать что-то вроде этого:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Form2 f = new Form2(this);
f.Show();
}
public void ShowMessage(string message)
{
MessageBox.Show(message);
}
}
public partial class Form2 : Form
{
private Form1 _parentForm;
public Form2(Form1 parentForm)
{
InitializeComponent();
_parentForm = parentForm;
_parentForm.ShowMessage("I am a message from form1);
}
}
Итак, в вашем примере вы бы добавили метод к родительской форме, который принимает в качестве параметра уникальное значение для строки, выбранной в dgv3, для отображения в gdv1. В методе (который является членом parentForm вы помещаете центрирующий код, который я покажу ниже).
Другие способы сделать это включают передачу делегата в дочернюю форму, которая является методом для центрирования представления данных. Преимущество этого заключается в том, что вы больше не привязаны к постоянному переходу в Form1 и даже можете выполнять различные действия в ответ на флажок, но это немного сложнее в реализации.
Центрирование на выбранной записи в DataGridView
Мой предпочтительный способ сделать это - использовать источник привязки для предоставления источника данных для сетки. Вы также можете напрямую получить доступ к положению сетки, используя свойство CurrentCell, но с помощью источника привязки вы получите немного больше отдачи.
В приведенном ниже коде у нас есть форма, которая создает BindingSource, устанавливает для его источника данных значение BindingList типа MyBindingList, а затем устанавливает источник привязки в качестве источника данных для представления данных.
Объекты в BindingList имеют уникальное свойство «PrimaryKey», позволяющее нам их находить.
Затем я показываю центрирующий код, который на самом деле очень прост.
Сначала мы получаем индекс в источнике привязки нужного вам, вызывая метод Find()
источника привязки.
Во-вторых, мы меняем положение источников привязки (это также обновляет отображение сетки данных).
Наконец, мы изменяем FirstDisplayedScrollingRowIndex представления данных, чтобы выбранная строка находилась не в самом верху или в нижней части сетки (вам нужно добавить проверку, чтобы убедиться, что это действительный индекс, если вы используете эту строку).
public partial class Form1 : Form
{
BindingSource bs;
public Form1()
{
InitializeComponent();
bs = new BindingSource();
MyBindingList<BackingObject> backing_objects = new MyBindingList<BackingObject>();
backing_objects.Add(new BackingObject{ PrimaryKey = 1, Name = "Fred", Hidden = "Fred 1"});
bs.DataSource = backing_objects;
dataGridView1.DataSource = bs;
}
private void button1_Click(object sender, EventArgs e)
{
int index = bs.Find("PrimaryKey", 5);
bs.Position = index;
dataGridView1.FirstDisplayedScrollingRowIndex = index - 1;
}
}
Теперь последнее, на что следует обратить внимание, это то, что связующий список из коробки не поддерживает метод Find()
источника связывания. Вот почему я использую свой собственный MyBindingList. Код для реализации этого можно найти здесь .
По существу вам нужен класс, подобный следующему:
public class MyBindingList<T> : BindingList<T>
{
protected override bool SupportsSearchingCore
{
get
{
return true;
}
}
protected override int FindCore(PropertyDescriptor prop, object key)
{
// Get the property info for the specified property.
PropertyInfo propInfo = typeof(T).GetProperty(prop.Name);
T item;
if (key != null)
{
// Loop through the items to see if the key
// value matches the property value.
for (int i = 0; i < Count; ++i)
{
item = (T)Items[i];
if (propInfo.GetValue(item, null).Equals(key))
return i;
}
}
return -1;
}
}