Electro_Attacks Ответов: 0

Как я могу получить исходное значение из datatable, привязанного к DTGV?


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


Это мой код до сих пор...
Private Property Manager As MetroStyleManager
    Private WithEvents Data As New DataTable
    Private WithEvents Binding As New BindingSource

    Public Sub New(ByVal styleManager As MetroStyleManager)
        Me.Manager = styleManager
        InitializeComponent()
    End Sub

    ' Register Manager
    Private Sub Register_Manager_Load() Handles MyBase.Load
        Me.StyleManager = Manager
        Register_Tabs.ButtonStyleManager = Manager
        Load_Design()
        Load_Sources()
        Load_Registers()
End Sub

    ' Register Manager: Load Design
    Private Sub Load_Design()
        If My.Settings.Main_DarkMode Then
            Manager.Theme = MetroThemeStyle.Dark
            Manager.Style = MetroColorStyle.Blue
        Else
            Manager.Theme = MetroThemeStyle.Light
            Manager.Style = MetroColorStyle.Green
        End If
    End Sub

    ' Register Editor: Load DataSources
    Private Sub Load_Sources()
        Data.Columns.Add("Register Name", GetType(String))
        Data.Columns.Add("Enties", GetType(Int64))
        Data.Columns.Add("Last Edit", GetType(DateTime))
        Data.Columns.Add("Size (Mb)", GetType(String))
        Data.AcceptChanges()

        Binding.DataSource = Data
        Register_Grid.DataSource = Binding
        Register_Grid.Columns(0).ReadOnly = False
        Register_Grid.Columns(0).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
        Register_Grid.Columns(1).ReadOnly = True
        Register_Grid.Columns(1).AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader
        Register_Grid.Columns(2).ReadOnly = True
        Register_Grid.Columns(2).AutoSizeMode = DataGridViewAutoSizeColumnMode.None
        Register_Grid.Columns(2).Width = 150
        Register_Grid.Columns(3).ReadOnly = True
        Register_Grid.Columns(3).AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader
    End Sub

' Register Manager: Load Registers
    Private Sub Load_Registers()
        Dim directoy = Application.StartupPath()
        For Each f In New IO.DirectoryInfo(directoy & "\register").GetFiles("*.csv")
            Dim name As String = f.Name
            Dim edit As String = f.LastWriteTime
            Dim entries As Int64 = File.ReadAllLines(f.FullName).Length - 1
            Dim size As Decimal = f.Length
            Data.Rows.Add(name, entries, edit, size.ToString("F3"))
        Next
    End Sub


Edit1 Я бы предпочел использовать RowStates для того, чтобы Гендель также удалял строки (тогда файлы тоже должны быть удалены)

Что я уже пробовал:

Я искал решение около 10 часов... И использовал много фрагментов кода, ничего не работало и не возвращало никаких значений, кроме значений "ничего"...

Большинство фрагментов использовали свойства DataRowState или DataViewRowState, но они, похоже, не работают с моим DataTable...

Richard MacCutchan

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

[no name]

Вы имеете в виду, что я должен использовать событие CellBeginEdit и сохранить значение в частном Dim Var?

Richard MacCutchan

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

[no name]

Я бы предпочел RowStates, потому что тогда я тоже могу читать удаленные строки :/

Richard MacCutchan

Неважно, какой метод вы выберете, главное, чтобы он делал то, что вы хотите. Единственным критерием является то, что вы можете определить, когда что-то меняется, и таким образом сохранить его текущее состояние. Вы также можете рассмотреть, что происходит, когда что-то было изменено один раз, и пользователь приходит и редактирует его снова.

[no name]

Ну а в тот момент, когда пользователь закончит редактирование, файл будет немедленно переименован( суб будет называться со старым именем и новым именем)
Так что даже если он снова внесет правку, ошибки не будет...
Кроме того, я написал свой собственный файловый менеджер, который будет выполнять все действия с файлами в блоке try, который будет возвращать успех true или false и при необходимости сообщение об ошибке...
Так что единственная часть, которая отсутствует, - это хорошее решение, чтобы получить старое имя...

Richard MacCutchan

Извините, но я не понимаю, в чем проблема. Если ваша подлодка вызывается как со старыми, так и с новыми именами, то именно там вы ее и сохраняете. Вам нужно решить, сколько информации вам нужно захватить, чтобы иметь возможность воссоздать исходное имя в любой момент в будущем.

[no name]

Ну, ладно, может быть, я думал усложнить xD

0 Ответов