C# LINQ到XML和DataGridView

C# LINQ到XML和DataGridView,c#,winforms,datagridview,linq-to-xml,.net-4.0,C#,Winforms,Datagridview,Linq To Xml,.net 4.0,嗨,我第一次尝试使用DataGridView,并且使用LINQ 以下是我想做的: 我想使用它(尽管它不必使用DataGridView)来读取和显示XML文件的内容(下面的代码是工作代码),但我想在表单上或DataGridView中有一个add row按钮,它接收三个文本框的内容,并填充新行三列的内容。新行将附加到现有数据 接下来,我想添加一个删除按钮来删除当前选中的行 最后,我需要一个保存按钮,将DataGridView的内容导出回一个XML文件,覆盖/更新现有的XML文件 所以我坚持添加额外的

嗨,我第一次尝试使用DataGridView,并且使用LINQ

以下是我想做的: 我想使用它(尽管它不必使用DataGridView)来读取和显示XML文件的内容(下面的代码是工作代码),但我想在表单上或DataGridView中有一个add row按钮,它接收三个文本框的内容,并填充新行三列的内容。新行将附加到现有数据

接下来,我想添加一个删除按钮来删除当前选中的行

最后,我需要一个保存按钮,将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>

001
我的测试
xyz
002
Adi2
ABCD
好的,我现在已将代码更改为:

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;
xdocumentxmldoc=XDocument.Load(@“queues.xml”);
var q=来自xmlDoc.Root.substands(“队列”)中的c
选择新队列
{
编号=c.元素(“编号”).值,
名称=c.元素(“名称”).值,
QueueTag=c.Element(“QueueTag”).Value
};
var queryAsList=newbindingslist(q.ToList());
bindingSource1.DataSource=查询列表;
dataGridView1.DataSource=bindingSource1;
这允许我从dataGridView中添加和删除行和数据:)

但我仍然无法从dataGridView或bindingSource1将数据写回XML:(

需要帮忙吗?
bindingSource1.count在我每次更改数据时都会更改,因此我认为我已经接近了!

也许您可以尝试使用会话中保存的xmlDoc(因此在回发时保留)…将三个元素(从文本框)添加到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");
}