Как получить новое объявленное значение DataGridViewRow по имени столбца (не по индексу)?

Я пытаюсь сохранить точную копию DataGridViewRow в теге той же строки, все работает нормально, и результаты такие, как должны быть... за исключением того, что когда я пытаюсь получить значение, используя имя столбца (в последней строке код), он говорит мне, что имя столбца не существует. Но если я использую индекс, все работает нормально.

Я пробовал использовать метод CreateCells() или Clone() структуры исходной таблицы, но все равно не работает.

Я мог бы придерживаться использования index. Но я бы предпочел получить значения по имени столбца. это возможно?

    ''Create and populate a datagridview with one row 
    Dim DGV As New DataGridView
    DGV.Columns.Add("No1", "No1")
    DGV.Columns.Add("No2", "No2")
    DGV.Columns.Add("No3", "No3")
    Dim Objects As New List(Of Object)
    Objects.Add("1")
    Objects.Add("2")
    Objects.Add("3")
    DGV.Rows.Add(Objects.ToArray)

    '' Loop to store a copy of itself into the Row's Tag
    For Each selectedrows As DataGridViewRow In DGV.Rows
        Dim DataGridViewRow As New DataGridViewRow
        Dim CellArray As New List(Of Object)
        DataGridViewRow.CreateCells(DGV)                      ''I have tried DataGridViewRow = selectedrow.clone and it still doesnt work
        For Each Cell As DataGridViewCell In selectedrows.Cells
            CellArray.Add(Cell.Value)
        Next
        DataGridViewRow.SetValues(CellArray.ToArray)
        selectedrows.Tag = DataGridViewRow
    Next

    DGV.Rows(0).Cells(0).Value = "Change"
    MessageBox.Show(DGV.Rows(0).Cells(0).Value)               ''Works (Output: Change)
    MessageBox.Show(DGV.Rows(0).Tag.Cells(0).Value)           ''Works (Output: 1)

    MessageBox.Show(DGV.Rows(0).Cells("No1").Value)           ''Works (Output: Change) 
    MessageBox.Show(DGV.Rows(0).Tag.Cells("No1").Value)       ''Doesnt Work (Output: System.ArgumentException: 'Column named No1 cannot be found.

Имя параметра: имя_столбца')


person Ryan Tan    schedule 13.09.2019    source источник
comment
Свойство .Tag является Object. Поможет ли это, если вы произнесете это так: MessageBox.Show(DirectCast(DGV.Rows(0).Tag, DataGridViewRow).Cells("No1").Value)? Кроме того, вы должны использовать Option Strict On.   -  person Andrew Morton    schedule 13.09.2019
comment
Здравствуйте, спасибо за ответ, я попробовал то, что вы предложили, и появилось то же сообщение об ошибке.   -  person Ryan Tan    schedule 13.09.2019
comment
Ааа.... вы не назвали столбцы, когда копировали ячейки.   -  person Andrew Morton    schedule 13.09.2019
comment
хм, я уже назвал столбцы в DGV.Columns.add(ColumnName,ColumnHeaderText). я бы предположил, что он скопирует все шаблоны, когда я использую метод createcells в DataGridViewRow. как назвать столбцы?   -  person Ryan Tan    schedule 13.09.2019
comment
Я не могу найти ничего из беглого просмотра документации, которая предполагает, что вы можете. Вы можете создать словарь (строка, целое число), чтобы получить индекс столбца из имени.   -  person Andrew Morton    schedule 13.09.2019
comment
Я полагаю, что мог бы использовать словарь, но я надеялся на что-то гораздо более прямолинейное. Спасибо, Андрей :)   -  person Ryan Tan    schedule 13.09.2019
comment
Чего вы действительно пытаетесь достичь с помощью копии строки внутри .Tag строки? XY проблема?   -  person HardCode    schedule 13.09.2019
comment
DataTables, привязанные к DataGridViews, имеют всевозможные версии и маркировку для состояния версии. Возможно, вы захотите проверить, есть ли в datatable нужная вам информация.   -  person Mary    schedule 14.09.2019
comment
Имя вашего столбца в DataGridViewRow исчезло, потому что вы помещаете массив при выполнении DataGridViewRow.SetValues.   -  person user11982798    schedule 16.09.2019


Ответы (1)


Как насчет того, если вы попытаетесь изменить свои строки:

    Dim rwIdx = 0
    For Each selectedrows As DataGridViewRow In DGV.Rows
        Dim myDataGridViewRow As New DataGridViewRow
        myDataGridViewRow = DGV.Rows(rwIdx)
        rwIdx = rwIdx + 1
        selectedrows.Tag = myDataGridViewRow
    Next

Приведенное выше будет относиться только к одной и той же строке, а не к клонированию данных, а ниже я скопирую выбранные строки в другое представление сетки данных:

    Dim DGV As New DataGridView
    DGV.Columns.Add("No1", "No1")
    DGV.Columns.Add("No2", "No2")
    DGV.Columns.Add("No3", "No3")
    Dim Objects As New List(Of Object)
    Objects.Add("1")
    Objects.Add("2")
    Objects.Add("3")
    DGV.Rows.Add(Objects.ToArray)


    '' Loop to store a copy of itself into the Row's Tag
    Dim DataGridViewRow As New DataGridViewRow
    Dim myRowIdx As Integer = 0
    For Each selectedrows As DataGridViewRow In DGV.Rows
        DataGridViewRow = New DataGridViewRow
        Dim dgv2 As New DataGridView
        For Each col As DataGridViewColumn In DGV.Columns
            dgv2.Columns.Add(DirectCast(col.Clone, DataGridViewColumn))
        Next
        For Each Cell As DataGridViewCell In selectedrows.Cells
            dgv2.Rows(0).Cells(Cell.ColumnIndex).Value = Cell.Value
        Next
        selectedrows.Tag = dgv2.Rows(0)
    Next
    MessageBox.Show(DGV.Rows(0).Cells(0).Value.ToString)                                       ''Works (Output: 1)
    MessageBox.Show(DirectCast(DGV.Rows(0).Tag, DataGridViewRow).Cells(0).Value.ToString)      ''Works (Output: 1)

    DGV.Rows(0).Cells(0).Value = "Change"
    MessageBox.Show(DGV.Rows(0).Cells(0).Value.ToString)                                       ''Works (Output: Change)
    MessageBox.Show(DirectCast(DGV.Rows(0).Tag, DataGridViewRow).Cells(0).Value.ToString)      ''Works (Output: 1)


    MessageBox.Show(DGV.Rows(0).Cells("No1").Value.ToString)                                   ''Works (Output: Change) 
    MessageBox.Show(DirectCast(DGV.Rows(0).Tag, DataGridViewRow).Cells("No1").Value.ToString)  ''Works (Output: 1)
person user11982798    schedule 16.09.2019
comment
OP хочет копию строки, а не ссылку на нее. - person Andrew Morton; 16.09.2019
comment
Я добавил несколько строк в качестве другого метода, но я думаю, что он все равно не будет отвечать за точную копию, как хочет OP, а просто заставит ее работать. - person user11982798; 16.09.2019