Удалить выбранный элемент datagridview из XML-файла - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть XML-файл (data / tools.xml), созданный программой C #, например:

<?xml version="1.0"?>
<ArrayOfToolClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ToolClass>
    <ToolID>1</ToolID>
    <ToolName>Multiflute Endmill</ToolName>
    <ToolDia>8</ToolDia>
    <ToolTooth>4</ToolTooth>
    <ToolApmxs>32</ToolApmxs>
    <ToolCuttingSpeed>200</ToolCuttingSpeed>
    <ToolFeedPerTooth>0.05</ToolFeedPerTooth>
    <ToolAe>4</ToolAe>
    <ToolAp>8</ToolAp>
    <ToolManufacturer>SECO</ToolManufacturer>
    <ToolSerial>FHAKJSH</ToolSerial>
  </ToolClass>
  <ToolClass>
    <ToolID>2</ToolID>
    <ToolName>Multiflute Endmill</ToolName>
    <ToolDia>4</ToolDia>
    <ToolTooth>4</ToolTooth>
    <ToolApmxs>25</ToolApmxs>
    <ToolCuttingSpeed>200</ToolCuttingSpeed>
    <ToolFeedPerTooth>0.03</ToolFeedPerTooth>
    <ToolAe>2</ToolAe>
    <ToolAp>4</ToolAp>
    <ToolManufacturer>SECO</ToolManufacturer>
    <ToolSerial>SJKHDKJ</ToolSerial>
  </ToolClass>
  <ToolClass>
    <ToolID>3</ToolID>
    <ToolName>Multiflute Endmill</ToolName>
    <ToolDia>20</ToolDia>
    <ToolTooth>4</ToolTooth>
    <ToolApmxs>38</ToolApmxs>
    <ToolCuttingSpeed>45</ToolCuttingSpeed>
    <ToolFeedPerTooth>0.02</ToolFeedPerTooth>
    <ToolAe>2</ToolAe>
    <ToolAp>20</ToolAp>
    <ToolManufacturer>SECO</ToolManufacturer>
    <ToolSerial>SJKHDKJ</ToolSerial>
  </ToolClass>
</ArrayOfToolClass>

Я загрузил этот файл в приложении Windows Form в datagridview. Изображение программы 1 Я хочу удалить элемент из XML-файла, который был выбран в datagridview.Я пытался с этим кодом:

 private void toolStripMenuItem1_Click(object sender, EventArgs e)
    {
        if (MessageBox.Show("Biztosan törlöd a szerszámot?", "Törlés", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            int id = (ToolsDataGridView.SelectedRows[0].Index) + 1;
            Console.WriteLine(id);

            XDocument xmlDoc = XDocument.Load(@"data\tools.xml");
            var elementsToDelete = from ele in xmlDoc.Descendants("ToolClass")
                                   where ele != null && ele.Element("ToolID").Value == id.ToString()
                                   select ele;

            foreach (var x in elementsToDelete)
            {
                x.RemoveAll();


            }

            xmlDoc.Save(@"data\tools.xml");
            ReadXmlData();
        }

Код удалить выбранный элемент из XML, но поместите <ToolClass /> на его место.Кто-нибудь может мне помочь, что я делаю не так?

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Привет Пара точек -

  1. Код удаляет выбранный элемент из xml, но помещает его на свое место.Кто-нибудь может мне помочь, что я делаю не так?

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

 xmlDoc.Descendants().Where(d => d.IsEmpty || String.IsNullOrWhiteSpace(d.Value)).Remove();

Подробнее об удалении пустых элементов можно прочитать здесь.

Когда я удалил элемент, ToolID не совпадает с индексом выбранной строки в виде сетки.Как я могу получить правильный ToolID на основе выбранной строки?

Код, который у вас будет работать, будет отлично работать для удаления записей, если выбранный ToolID имеет форму инкрементного способаНапример, в вашем примере XML идентификаторы инструментов равны 1,2 и 3, и если вы выберете 1-ую строку, она будет удалена при добавлении 1 к выбранному индексу, иначе, если ваши идентификаторы инструментов аналогичны данным на снимке экрана (Как и идентичные идентификаторы инструментов для нескольких записей), вам придется изменить приведенную ниже логику, которая удалит все записи с этим идентификатором инструмента -

int id = (ToolsDataGridView.SelectedRows[0].Index) + 1;

To,

int id = Convert.ToInt32((dataGridView1.SelectedRows[0].Cells["ToolID"]).Value);
0 голосов
/ 24 сентября 2018

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

Я не думаю, что можно выполнить те же манипуляцииusing и XML data source.

Пока ваш код правильно удаляет требуемые элементы XML, вам, вероятно, придется заново привязывать файл к сетке - я не уверен, что это ваша строка "ReadXmlData ();»делает.

Чтобы получить значение из ячейки, такое как идентификатор, вам нужно использовать ToolsDataGridView.SelectedRows [0] .Cells [...] - либо по имени, либо по позиции, а затем получить значение, которое выприведите к правильному типу - в вашем случае это будет строка, а не целое число, так как данные поступают из XML без схемы или другого определения для вызова на

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...