DisplayIndex неправильно читает, когда строки скрыты - PullRequest
0 голосов
/ 26 апреля 2018

Цель - скопировать данные выбранной ячейки из выбранной строки.

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

var currentCell = e.ClipboardRowContent[VwrGrid.CurrentCell.Column.DisplayIndex];
e.ClipboardRowContent.Clear();
e.ClipboardRowContent.Add(currentCell);

Это отлично работает! единственная проблема заключается в том, что если некоторые из столбцов скрыты, DisplayIndex читает неправильно.

Так что, если у нас есть пункт 1, пункт 2 и пункт 3.

Если все отображаются, и я выбрал item3 и скопировал его, я получаю значение ячейки в Item 3.

Проблема в том, что если элемент 2 свернут / не показан, то копирование элемента 3 скажет вам, что вы пытаетесь копировать за пределы. потому что он считается displayIndex, 3 слева, и только два были показаны. поэтому он перемещается за пределы стола

No such field as index

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Поскольку это WPF, и я не могу просто использовать индекс, я просто перебираю столбцы и подсчитываю количество столбцов, для которых их видимость свернута, до столбца, для которого мы пытались получить displayindex. Затем вычли это число из displayIndex.

private void DataGrid_CopyingRowClipboardContent(object sender, DataGridRowClipboardEventArgs e)
{
    //because we need to use displayindex, we need to check how many collapsed columns there are before our column, and adjust our display index accordingly
    int invisibleCols = 0;
    foreach(DataGridColumn col in VwrGrid.Columns)
    {
        if (col.Visibility == Visibility.Collapsed)
            invisibleCols++;

        if (col.Header.ToString() == VwrGrid.CurrentCell.Column.Header.ToString()) break;
    }
    try
    {
        var currentCell = e.ClipboardRowContent[VwrGrid.CurrentCell.Column.DisplayIndex - invisibleCols];
        e.ClipboardRowContent.Clear();
        e.ClipboardRowContent.Add(currentCell);
    }
    catch
    {

    }
}
0 голосов
/ 26 апреля 2018

Для WPF Datagrid попробуйте это:

// The clipboard row works only for visible cells
// To obtain the data column use the columnIndex and then map that to the Columns collection
int columnIndex = dataGrid.CurrentCell.Column.DisplayIndex;
var column = dataGrid.Columns[columnIndex];

// Now get the needed column 
var cellContent = e.ClipboardRowContent.Where(i => i.Column == column).First();
e.ClipboardRowContent.Clear();
e.ClipboardRowContent.Add(cellContent);

Для Winforms:

Вместо этого используйте .Index. .DisplayIndex применяется только к видимым столбцам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...