Nano Hash - криптовалюты, майнинг, программирование

Использование DataViewRowState для назначения стилей DataGridViewCell

У меня есть DataGridView только для чтения, привязанный к источнику привязки. В форме есть и другие элементы управления, которые обновляют DataGridViewCells — они привязаны к источнику привязки. Мне нужно изменить стили datagridviewCell на основе того, что такое DataViewRowState источника - .Current мне не помогает - мне нужно отследить ячейку с исходным значением - покрасить ячейку в нормальный цвет, если она изменена, покрасьте ее в синий цвет . Я знаю, что могу получить DataRowViewState, который дает мне версию, которую я получаю, но она всегда возвращается в актуальном состоянии (так как это значение по умолчанию), и мне нужен текущий - я просто хочу знать, отличается ли он от оригинала или нет для именно этот столбец. Поскольку в моем редактировании источника привязки у меня уже есть строка, похоже, нет простого метода или свойства, которое говорит, что эта строка является исходной или измененной. Нужно ли мне запускать выборку с использованием состояния фильтра в таблице, чтобы получить мою строку и посмотреть, получу ли я результаты, а затем, если это так, изменить ячейку, чтобы сделать это?

Соответствующий код: - Я знаю, что это в VB.net, но если у вас есть пример С#, это нормально, мне все равно, какой - код .net - это код, и я могу его преобразовать.

Private Sub UpdateCellValue(columnName As String, textValue As String)

    If dgvBayList.SelectedRows.Count > 0 Then
        Dim crow As DataGridViewRow = dgvBayList.SelectedRows(0)
        Dim drv As DataRowView = DirectCast(bsBins.Current, DataRowView)

        If crow.Cells(columnName).Value = textValue Then
            Exit Sub
        End If

        drv.BeginEdit()
        drv.Row.BeginEdit()
        drv.Row.SetField(Of String)(columnName, textValue)
        ' My Problem here is of course it is always original, 
        ' the row states of the Row always show Modified. 
        ' This happens when the binding source gets filled and bound to datagridview.

        Select Case drv.RowVersion
            Case DataRowVersion.Original
                Dim val As String = drv.Row(0).ToString()
                Exit Select
            Case DataRowVersion.Proposed
                Dim val As String = drv.Row(0).ToString()
                Exit Select
            Case DataRowVersion.Current
                Dim val As String = drv.Row(0).ToString()
                Exit Select
            Case DataRowVersion.Default
                Dim val As String = drv.Row(0).ToString()
                Exit Select
        End Select
        crow.Cells(columnName).Value = textValue
        drv.Row.EndEdit()
        drv.EndEdit()
        Dim dt As DataTable = sortingDataSet.bins

    End If

End Sub
18.08.2016

  • Кажется, вам нужен drv.Row.RowState, а не drv.RowVersion 18.08.2016
  • @Steve my RowState всегда изменяется даже до модификации; Я не знаю, почему это так. Источник привязки привязан к набору данных. Таблица, которая заполняется при загрузке формы. Поскольку он всегда объявляет измененным с самого начала, это мне не помогает. Мне также нужно знать, изменил ли пользователь его обратно на исходный - я хочу, чтобы он выглядел как обычная неизмененная ячейка. Я думаю, мне нужно будет выбрать с помощью rowfilter - должен быть более простой способ. Я надеюсь, что есть один. 18.08.2016
  • Если я смотрю на RowState в событии форматирования ячейки, у меня это работает нормально. 18.08.2016
  • @Plutonix - когда я смотрю на это в событии форматирования ячейки, оно показывает измененное состояние строки - мои исходные строки привязки отображаются измененными (все, что я сделал, это загрузил представление сетки данных из набора данных и ничего больше), если пользователь формы изменит значение обратно - оно также не следует говорить о модификации. Я программно редактирую непосредственно в источнике данных привязки, а не в представлении сетки данных. Однако я нашел этот stackoverflow.com/questions/1050837/, которая может быть полезной - я могу сравнить оригинал с текущим. 18.08.2016

Ответы:


1

Посмотрев комментарии и используя разные мысли для поиска, я нашел ответ SO, который предоставил часть решения Как я могу получить конкретную версию строки набора данных?.

Чтобы реализовать это решение, мне нужно было настроить механизм для вызова универсальной функции, где T не был известен до времени выполнения. Посмотрев еще раз на SO - я нашел для этого несколько хороших ответов; Как использовать отражение для вызова универсального метода?< /а> .

Ниже приведен окончательный код, который я использую Из моих элементов управления измененное значение для реализации изменений в представлении сетки данных и применения стилей к отдельным ячейкам на основе исходных или предлагаемых значений.

Private Sub UpdateCellValue(Of T)(columnName As String, value As T)

    If dgvBayList.SelectedRows.Count > 0 Then

        Dim crow As DataGridViewRow = dgvBayList.SelectedRows(0)

        Dim drv As DataRowView = DirectCast(bsDataSource.Current, DataRowView)

        If crow.Cells(columnName).Value = value Then
            Exit Sub
        End If

        drv.BeginEdit()

        drv.Row.BeginEdit()

        drv.Row.SetField(Of T)(columnName, value)

        crow.Cells(columnName).Value = value

        Dim objType As Type = drv.Row(columnName).GetType()

        Dim method As Reflection.MethodInfo = _
                 Me.GetType().GetMethod("SetDataGridViewCellStyle", _
                 Reflection.BindingFlags.Instance Or _ 
                 Reflection.BindingFlags.NonPublic Or _
                 Reflection.BindingFlags.Public)

        Dim GenericSetDataGridViewCellStyle As Reflection.MethodInfo = _
                                               method.MakeGenericMethod(objType)

        Dim parms As Object() = {crow.Cells(columnName), drv, columnName}

        GenericSetDataGridViewCellStyle.Invoke(Me, parms)

        drv.Row.EndEdit()
        drv.EndEdit()
    End If

End Sub

Private Sub SetDataGridViewCellStyle(Of T) ( _
                             cell As DataGridViewCell, _
                             dRowView As DataRowView, _ 
                             columnName As String)

    Dim nothingness As Integer = 0

    If dRowView.Row.Field(Of T)(columnName, DataRowVersion.Original) Is Nothing Then
        nothingness += 1
    End If

    If dRowView.Row.Field(Of T)(columnName, DataRowVersion.Current) Is Nothing Then
        nothingness += 1
    End If

    If nothingness = 0 Then

        Dim original As T = dRowView.Row.Field(Of T)(columnName, DataRowVersion.Original)
        Dim current As T = dRowView.Row.Field(Of T)(columnName, DataRowVersion.Current)
        Dim proposed As T = dRowView.Row.Field(Of T)(columnName, DataRowVersion.Proposed)

        If EqualsCompare(Of T)(original, proposed) Then   

            cell.Style.BackColor = Color.FromKnownColor(KnownColor.White)

        Else

            cell.Style.BackColor = Color.FromKnownColor(KnownColor.Fuchsia)

        End If

    Else
        If nothingness = 2 Then

            cell.Style.BackColor = Color.FromKnownColor(KnownColor.White)
        Else
            ' cell.Style.BackColor = Color.FromKnownColor(KnownColor.Fuchsia)'
        End If

    End If

    cell.DataGridView.Update()

End Sub

Public Shared Function EqualsCompare(Of T)(a As T, b As T) As Boolean

    Return EqualityComparer(Of T).[Default].Equals(a, b)

End Function

И я называю это так

UpdateCellValue(Of Boolean)("kickingIt", True)

Релевантные ссылки, которые мне помогли

Как получить конкретную версию набора данных строка?

Как использовать отражение для вызова универсального метода?< /а>

18.08.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..