Сохранить порядок строк набора данных XmlWriter vb

Попытка написать некоторый код для изменения порядка элементов в XML-файле через пользовательский интерфейс. Вопрос в том, как: контролировать физические элементы порядка хранения, записанные в WriteXML

Например, я хочу преобразовать:

<Image Name="Middle" file="Sauce.png" />
<Image Name="Top" file="Cheese.png" />
<Image Name="Bottom" file="PizzaBase.png" />

чтобы:

<Image Name="Top" file="Cheese.png" />
<Image Name="Middle" file="Sauce.png" />
<Image Name="Bottom" file="PizzaBase.png" />

в файле. Подход пока:

.xml> набор данных> datagridview (связанный dataset.table)

Это прекрасно работает, позволяя пользователю перемещать строку / элемент вверх и вниз. Любое движение строки отражается в Dataset.table, когда я просматриваю это в Locals (то есть, если "Cheese" перемещается наверх в DatagridView, он также находится наверху в наборе данных).

Однако, когда я пишу это обратно в XML через XMLWriter, любые перемещенные строки добавляются в конец XML, а не в том же порядке набора данных. Например, если я переместил "сыр" вверх, то результат будет выглядеть так:

<Image Name="Middle" file="Sauce.png" />
<Image Name="Bottom" file="PizzaBase.png" />
<Image Name="Top" file="Cheese.png" />

Был поиск вокруг - ничего не мог найти по этому поводу. У кого-нибудь есть идеи?


РЕДАКТИРОВАТЬ: Вот как я переупорядочиваю строки:

 Private Sub _RigRowUp_Click(sender As Object, e As EventArgs) Handles _RigRowUp.Click
        If IsNothing(_RigImgsDGV.DataSource)
            Return
        End If
        Dim selectedRow As DataRow = _RigXMLImgsDS.Tables("Image").Rows(_RigImgsDGV.CurrentRow.Index)
        Dim selectedindex As Integer = _RigXMLImgsDS.Tables("Image").Rows.IndexOf(selectedRow)
        If selectedindex <= 0 Then
            Return
        End If
        Dim newRow As DataRow = _RigXMLImgsDS.Tables("Image").NewRow()
        newRow.ItemArray = selectedRow.ItemArray
        _RigXMLImgsDS.Tables("Image").Rows.Remove(selectedRow)
        _RigXMLImgsDS.Tables("Image").Rows.InsertAt(newRow, selectedindex - 1)
        _RigImgsDGV.ClearSelection()
        _RigImgsDGV.CurrentCell = _RigImgsDGV.Rows(selectedindex - 1).Cells(0)
        _RigImgsDGV.Rows(selectedindex - 1).Selected = True
    End Sub

_RigXMLImgsDS - это DataSet. RigImgsDGV - это DataGridView.

Связанный в публичной подпрограмме в другом месте через:

  _RigImgsDGV.DataSource = New BindingSource(_RigXMLImgsDS.Tables("Image"), Nothing)

1 ответ

Решение

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

Dim _tempDT As DataTable
    _tempDT = _RigXMLImgsDS.Tables("Image").Copy()
    _RigXMLImgsDS.Tables("Image").Clear()
    For Each DataRow In _tempDT.Rows
        _RigXMLImgsDS.Tables("Image").ImportRow(DataRow)
    Next

Затем используйте XMLWriter как обычно. Благодаря Плутоникс.

Другие вопросы по тегам