Как перейти к последнему нажатию на строку в представлении данных - PullRequest
2 голосов
/ 18 октября 2011

Следующий код используется для заполнения DGV:

  private void frmSwitch_Load(object sender, EventArgs e)
    {
         // TODO: This line of code loads data into the 'newCityCollectionDataSet.PropertyInformation' table. You can move, or remove it, as needed.
        this.propertyInformationTableAdapter.Fill(this.newCityCollectionDataSet.PropertyInformation);
        // TODO: This line of code loads data into the 'newCityCollectionDataSet.ClientTable' table. You can move, or remove it, as needed.
        this.clientTableTableAdapter.Fill(this.newCityCollectionDataSet.ClientTable);

    }

Этот код позволяет мне передать необходимую информацию в «сводную форму»:

    private void propertyInformationDataGridView_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
        System.Data.DataRowView SelectedRowView;
        newCityCollectionDataSet.PropertyInformationRow SelectedRow;

        SelectedRowView = (System.Data.DataRowView)propertyInformationBindingSource.Current;
        SelectedRow = (newCityCollectionDataSet.PropertyInformationRow)SelectedRowView.Row;

        frmSummary SummaryForm = new frmSummary(this);
        SummaryForm.LoadCaseNumberKey(SelectedRow.CaseNumberKey, true, null);
        SummaryForm.LoadBRTNumberKey(SelectedRow.BRTNumber, null);
        SummaryForm.Show();

    }

Что ядля этого нужно передать SelectedRow и добавить 1 для перехода к следующей строке, если текущий SelectedRow больше не действителен (например, когда FileFinishedCheckBox отмечен в «сводной форме»).Я также хочу, чтобы это происходило каждый раз, когда в DataGridview установлен флажок, чтобы людям не приходилось прокручивать назад файл, над которым они работают.

Код, который выполняет обновление при необходимости, выглядит следующим образом:

        public void PerformRefresh() 
        {
         this.propertyInformationBindingSource.EndEdit();
         this.propertyInformationTableAdapter.Fill(this.newCityCollectionDataSet.PropertyInformation);
         this.propertyInformationDataGridView.Refresh();      
        }

Любая помощь будет отличной.

1 Ответ

2 голосов
/ 20 октября 2011

Этот вопрос, кажется, состоит из двух частей:

  1. Как общаться между двумя формами окон
  2. Как изменить выбранную строку в сетке данных

Есть множество разных способов решения обеих задач, поэтому я просто дам вам два, которые будут работать. Первый (для оконных форм) является самым простым, а второй (для изменения выбранной строки), по моему мнению, является правильным методом.

Связь между окнами форм

Самый простой способ связи между двумя формами окон - передать ссылку на одну форму в другую форму.

Допустим, у вас есть 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;
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...