Обновить позицию CurrencyManager - PullRequest
1 голос
/ 14 марта 2011

У меня есть ContextMenuStrip, который используется на DataGridView, DataGridView находится внутри панели SplitContainer. Мои пользователи попросили, чтобы они могли щелкнуть правой кнопкой мыши по любой строке в сетке, и строка, по которой они щелкнули правой кнопкой мыши, станет выбранной строкой, и появится меню. Код, который я работал, пока я не разместил DataGridView внутри панели SplitContainer

private void DataGridView_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            // Get the row that was right-clicked on
            DataGridView.HitTestInfo hitTestInfo = DataGridView.HitTest(e.X, e.Y);
            if (hitTestInfo != DataGridView.HitTestInfo.Nowhere)
            {
                // Change the binding source position to the new row to 'select' it
                BindingSource.CurrencyManager.Position = hitTestInfo.RowIndex;
            }
        }
    }

Кажется, что все работает нормально, пока не достигнет последней строки

BindingSource.CurrencyManager.Position = hitTestInfo.RowIndex;

Позиция всегда остается на -1, даже если hitTestInfo.RowIndex имеет другое значение, которое она пытается присвоить. Может ли это быть из-за панели SplitContainer? Если это так, какие-либо предложения о том, как это исправить?

Спасибо

1 Ответ

3 голосов
/ 14 марта 2011

Проблема в том, что вы получаете доступ к CurrencyManager через BindingContext (из DataGridView), чтобы получить правильный BindingManager.Я взял ваш исходный код только что заменил BindingSource.CurrencyManager на (dataGridView1.BindingContext[dataGridView1.DataSource] as CurrencyManager), и он работает как шарм.Ниже приведен полный обработчик событий с этим изменением.Мое имя DataGridView dataGridView1 .

    private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
    {
         if (e.Button == MouseButtons.Right)        
         {           
             // Get the row that was right-clicked on            
             DataGridView.HitTestInfo hitTestInfo = dataGridView1.HitTest(e.X, e.Y);            
             if (hitTestInfo != DataGridView.HitTestInfo.Nowhere)            
             {                
                 // Change the binding source position to the new row to 'select' it                
                 (dataGridView1.BindingContext[dataGridView1.DataSource] as CurrencyManager).Position  = hitTestInfo.RowIndex;            
             }       
         }
    }
...