Сохранить порядок строк набора данных 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 как обычно. Благодаря Плутоникс.