Определить форму нескольких выделенных ячеек в сетке данных - PullRequest
0 голосов
/ 28 сентября 2011

Я использую Infragistics UltraWinGrid для представления некоторых данных. Мне нужны некоторые функции копирования / вставки Excel. Это легко.

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

  2. Затем мне нужно обнаружить все граничные граничные ячейки, чтобы я мог поместить границу «Вы скопировали эту» вокруг ячеек, в Excel.

Я надеюсь достичь этого путем сравнения списка структур Point или чего-то подобного.

Чтобы лучше проиллюстрировать проблему, вот несколько картинок:

Working image

1. Это нормально, смотрите краевые клетки (дух)

Fail image]

2. Это не будет работать, я пытался скопировать слишком много, показать ошибку

Another fail image

3. Пользователь еще не узнал, что это просто не сработает. Вы даже можете увидеть, где я скопировал «неправильную» ячейку из-за своей лени.

У меня есть словарь точек и ячеек, с которым можно работать. Есть идеи? C # / VB в порядке.

UPDATE: Это может помочь?

Взяв вторую диаграмму:

0,0 1,0 2,0
0,1 1,1 2,1
0,2 1,2 2,2
0,3 1,3 2,3
    1,4     <<< wrong

Спасибо, Том

1 Ответ

0 голосов
/ 30 сентября 2011

Хорошо, я хорошо об этом подумал, и ГертАрнольд указал мне правильное направление, просто сказав «диапазон ячеек с разрешенной дырой?»

Это то, что происходит, когда вы тратите 6 месяцев, не занимаясь кодированием или решением проблем, из-за большого количества документов и требований аудита вы забываете, как даже начать простой алгоритм.

Это так легко, что больно. Сначала я получаю ячейки из таблицы и переформатирую их так, чтобы они основывались на нуле (в отличие от их фактического положения в сетке). Я делаю это, просто отрицая значение ячейки в {0,0} и применяя это ко всем ячейкам.

Чтобы рассчитать разрывы, сделайте следующее:

Private Function HasGapsInCells(points As List(Of CellPoint)) As Boolean

    Dim colCount As Integer = points.GroupBy(Function(x) x.Column).Count()
    Dim rowCount As Integer = points.GroupBy(Function(x) x.Row).Count()

    For row As Integer = 0 To rowCount - 1
        Dim rowL As Integer = row
        For col As Integer = 0 To colCount - 1
            Dim colL As Integer = col
            If Not points.Exists(Function(x) x.Row = rowL And x.Column = colL) Then
                Return True '-- There are gaps'
            End If
        Next
    Next

    Return False

End Function

Так просто.

...