LINQ to XML и DataGridView - PullRequest
       14

LINQ to XML и DataGridView

2 голосов
/ 26 октября 2010

Привет, я пытаюсь использовать DataGridView впервые и с помощью LINQ.

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

Далее я хотел бы добавить кнопку Удалить, чтобы удалить выбранную строку.

И, наконец, я хочу кнопку сохранения, которая экспортирует содержимое DataGridView обратно в файл XML, перезаписывая / обновляя существующий файл XML.

Так что я застрял при добавлении дополнительных данных! но так как в настоящее время я не имею ни малейшего понятия об удалении или сохранении, я решил попросить все сразу!

Итак, вот код, который я должен прочитать в XML-файле:

XDocument xmlDoc = XDocument.Load(@"queues.xml");
var q = from c in xmlDoc.Root.Descendants("Queue")
        select new
        {
            QueueNumber = c.Element("Number").Value,
            QueueName = c.Element("Name").Value,
            QueuePCC = c.Element("QueueTag").Value
        };

dataGridView1.DataSource = q.ToList();

XML-документ:

<?xml version="1.0" encoding="utf-8" ?>
<Queues>
  <Queue>
    <Number>
      001
    </Number>
    <Name>
      mytest
    </Name>
    <QueueTag>
      xyz
    </QueueTag>
  </Queue>
  <Queue>
    <Number>
      002
    </Number>
    <Name>
      Adi2
    </Name>
    <QueueTag>
      ABCD
    </QueueTag>
  </Queue>
</Queues>

Хорошо, теперь я изменил свой код на это:

XDocument xmlDoc = XDocument.Load(@"queues.xml");
var q = from c in xmlDoc.Root.Descendants("Queue")
        select new Queue
        {
            Number = c.Element("Number").Value,
            Name = c.Element("Name").Value,
            QueueTag= c.Element("QueueTag").Value
        };

var queryAsList = new BindingList<Queue>(q.ToList());

bindingSource1.DataSource = queryAsList;
dataGridView1.DataSource = bindingSource1;

Это позволяет мне добавлять и удалять строки и данные из dataGridView:)

Но я все еще не могу найти способ записи данных обратно в XML ни из dataGridView, ни из bindingSource1: (

Любая помощь, пожалуйста? bindingSource1.count меняется каждый раз, когда я изменяю данные, поэтому я думаю, что я близок!

1 Ответ

1 голос
/ 26 октября 2010

Возможно, вы можете попытаться работать с xmlDoc, сохраненным в сеансе (таким образом, сохраненным с обратными передачами) ... Добавить три элемента (из текстовых полей) в XmlDoc ... И заново привязать сетку к xmlDoc при каждой обратной передаче .

В конце вы можете выполнить xmlDoc.save ().

Для удаления строк вы можете использовать событие GridView dataGridView1_RowDeleted, чтобы редактировать xmlDoc (чтобы удалить узел относительно выбранной строки).

Что-то вроде:

protected void ButtonLoadGridView_Click(object sender, EventArgs e)
{
    XDocument xmlDoc = XDocument.Load(@"f:\queues.xml");
    var q = from c in xmlDoc.Root.Descendants("Queue")
            select new
            {
                QueueNumber = c.Element("Number").Value,
                QueueName = c.Element("Name").Value,
                QueuePCC = c.Element("QueueTag").Value
            };
    dataGridView1.DataSource = q.ToList();
    Session.Add("xmlDoc",xmlDoc);        
}

public void dataGridView1_RowDeleting(Object sender, GridViewDeleteEventArgs e)
{
    // get some node information:

    int rowIndex = e.RowIndex;            
    string someNodeInfo = dataGridView1.Rows[rowIndex].Cells[0].Text;            

    // then edit xml :
    XmlDocument xmlDoc = (XmlDocument) Session["xmlDoc"];
    xmlDoc.ChildNodes.Item(rowIndex).RemoveAll();
    Session.Add("xmlDoc", xmlDoc);
}


protected void ButtonSave_Click(object sender, EventArgs e)
{
    XmlDocument xmlDoc = (XmlDocument)Session["xmlDoc"];
    xmlDoc.Save(@"f:\queues2.xml");
}
...