Программно измените выбор на DatagridView (.NET)

Обновление с учетом этого набора данных: я вижу, куда вы идете с этим. Обратите внимание, что в НЕКОТОРЫХ случаях нет строки перед заданной, поэтому она возвращает только 2, а не 3. Здесь я обновил версию CTE. Снимите комментарий с ДРУГОЙ строки, чтобы увидеть 3, а не 2, так как перед выбранной строкой стоит один с этим Itemid.

Добавлена ​​переменная, демонстрирующая, как это лучше, позволяя вам получить 1 до и после или 2 до / после, если вы измените это число (т.е. передаете параметр) - и если меньше строк, или ни один не до или после того, как он получает столько, сколько может в рамках этого ограничения.

Настройка данных для всех версий:

Declare @OderDetail table
(
    Id int primary key,
    OrderId int,
    ItemId int,
    OrderDate DateTime2,
    Lookup varchar(15)
)

INSERT INTO @OderDetail 
VALUES  
(1, 10, 1, '2018-06-11', 'A'), 
(2, 10, 2, '2018-06-11', 'BE'), --this
(3, 2, 1, '2018-06-04', 'DR'),
(4, 2, 2, '2018-06-04', 'D'),  --this
(5, 3, 2, '2018-06-14', 'DD'), --this
(9, 4, 2, '2018-06-14', 'DD'), 
(6, 4, 2, '2018-06-14', 'R'),
--(10, 10, 2, '2018-06-02', 'BE'), -- un-comment to see one before
(23, 4, 2, '2018-06-14', 'R');

DECLARE 
    @ItemId int = 2,
    @orderid int = 2;

Обновленная версия CTE:

DECLARE @rowsBeforeAndAfter INT = 1;
;WITH cte AS (
    SELECT 
        Id,
        OrderId,
        ItemId,
        OrderDate,
        [Lookup],
        ROW_NUMBER() OVER (ORDER BY OrderDate,Id) AS RowNumber
    FROM @OderDetail
    WHERE 
        ItemId = @itemId -- all matches of this
),
myrow AS (
    SELECT TOP 1
        Id,
        OrderId,
        ItemId,
        OrderDate,
        [Lookup],
        RowNumber
    FROM cte
    WHERE 
        ItemId = @itemId 
        AND OrderId = @orderid
)
SELECT 
    cte.Id,
    cte.OrderId,
    cte.ItemId,
    cte.OrderDate,
    cte.[Lookup],
    cte.RowNumber
FROM ctE
INNER JOIN myrow
    ON ABS(cte.RowNumber - myrow.RowNumber) <= @rowsBeforeAndAfter
ORDER BY OrderDate, OrderId;

Возможно, вы хотите использовать метод CTE ( См. Оригинал в конце этого [ 1114]) однако:

Просто чтобы указать, это дает правильные результаты, но, вероятно, это не то, к чему вы стремитесь, так как это зависит от порядка строк и идентификатора элемента не фактической строки с этими двумя значениями :

SELECT TOP  3
    a.Id,
    a.OrderId,
    a.ItemId,
    a.Lookup
FROM @OderDetail AS a
WHERE 
     a.ItemId = @ItemId

Чтобы исправить это, вы можете использовать ORDER BY и TOP 1 с некрасивым UNION. (ОБНОВЛЕНО с сортировкой по дате и! = По идентификатору.)

SELECT 
        u.Id,
        u.OrderId,
        u.OrderDate,
        u.ItemId,
        u.Lookup
FROM (
    SELECT 
        a.Id,
        a.OrderId,
        a.OrderDate,
        a.ItemId,
        a.Lookup
    FROM @OderDetail AS a
    WHERE 
         a.ItemId = @ItemId
         AND a.OrderId = @orderid
    UNION 
    SELECT top 1
        b.Id,
        b.OrderId,
        b.OrderDate,
        b.ItemId,
        b.Lookup
    FROM @OderDetail AS b
    WHERE 
         b.ItemId = @ItemId
         AND b.OrderId != @orderid
    ORDER BY b.OrderDate desc, b.OrderId
    UNION 
    SELECT top 1
        b.Id,
        b.OrderId,
        b.OrderDate,
        b.ItemId,
        b.Lookup
    FROM @OderDetail AS b
    WHERE 
         b.ItemId = @ItemId
        AND b.OrderId != @orderid
    ORDER BY b.OrderDate asc, b.OrderId 
) AS u
ORDER BY u.OrderDate asc, u.OrderId 
15
задан C-Pound Guru 25 July 2012 в 15:33
поделиться

3 ответа

Возможно, что-то вроде этого:

    If DataGridView1.RowCount > 0 Then

        Dim MyDesiredIndex As Integer = 0

        If DataGridView1.CurrentRow.Index < DataGridView1.RowCount - 1 Then
            MyDesiredIndex = DataGridView1.CurrentRow.Index + 1
        End If

        DataGridView1.ClearSelection()            
        DataGridView1.CurrentCell = DataGridView1.Rows(MyDesiredIndex).Cells(0)
        DataGridView1.Rows(MyDesiredIndex).Selected = True

    End If

Примечание 1: , возможно, эти две строки не необходимы. Я havenВґt доказал его

        DataGridView1.ClearSelection()            
        DataGridView1.CurrentCell = DataGridView1.Rows(MyDesiredIndex).Cells(0)

Примечание 2: примечание, что, если мы находимся в последней строке, оно переходит к первому

23
ответ дан 1 December 2019 в 02:02
поделиться

Необходимо установить свойство Selected конкретной строки на истинный. Я думаю, что VB был бы чем-то вроде этого:

someDGV.Rows(index).Selected = True
4
ответ дан 1 December 2019 в 02:02
поделиться

Вы могли сделать это этот путь:

If DataGridView1.CurrentRow.Index < DataGridView1.Rows.Count Then
    DataGridView1.Rows(DataGridView1.CurrentRow.Index + 1).Selected = True
End If
0
ответ дан 1 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: