2010-10-26 7 views
2

Привет Я пытаюсь использовать DataGridView в первый раз и с LINQ.LINQ to XML и DataGridView

Вот что я пытаюсь сделать: Я хочу использовать его (хотя это не обязательно для 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

Возможно, вы можете попробовать работать с xmlDoc, сохраненным в сеансе (таким образом, сохраняться с помощью postbacks) ... Добавить три элемента (из текстовых полей) в XmlDoc ... И переустановить gridview на 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"); 
}