【问题标题】:How to load XML "row" into index of listbox C#如何将 XML“行”加载到列表框 C# 的索引中
【发布时间】:2013-04-09 15:32:40
【问题描述】:

我正在尝试将 xml 的单个“行”加载到列表框索引。

<?xml version="1.0" encoding="utf-8"?>
<!--User | 4/16/2013 @ 10:05 PM-->
<ContactBook>
<Contact>
<Name>
   <Name>personName</Name>
</Name>
<City>
   <City>testCity</City>
</City>
<State>
   <State>testState</State>
</State>
<Phone>
   <Phone>testPhone</Phone>
</Phone>
</Contact>
</ContactBook>

所以我想让姓名、城市、州和电话显示在列表框中的一行上,然后让下一个联系人出现在下一个列表框行中。

我也想知道是否有人有一些很好的网站来展示如何更新 XML 文件而不是覆盖它们。

/由于评论中的问题而编辑/

我真的不知道从哪里开始。我的 xml 文件是从一个对话框(类中的几个文本框)写入的,this.Tag 更新列表框,并保存到 xml 文件中。但是,如果保存了第二组联系信息,它会覆盖第一组,而不是附加它。

/编辑/

感谢 LexeRoy,我获得了更多的了解,但是,我仍然挂断了电话。

private void updateXml_Click(object sender, EventArgs e)
{
    var xDoc = XDocument.Load(book);
    var listBoxItems = xDoc.Elements("Contact");
    listBox1.Items.Add(listBoxItems);
}

其中 book 是代表我的 xml 文件路径的变量,而 listBox1 是显而易见的。 不幸的是,在单击按钮时,第一行得到这个值:

System.Xml.Linq.XContainer+<GetElements>d_11 

现在已经声明了数据源,我得到了一个抛出的异常:

【问题讨论】:

  • 你试过什么?有很多方法可以解决这个问题;例如,您可以尝试反序列化或 linq to xml。这个想法是把这个“记录”变成一个你可以绑定你的列表框的对象。
  • 这就是问题所在。我真的不知道从哪里开始。我的 xml 文件是从一个对话框(类中的几个文本框)写入的,this.Tag 更新列表框,并保存到 xml 文件中。但是,如果保存了第二组联系信息,它会覆盖第一组,而不是附加它。
  • 我有一个想法,但是当我看到then have the next contact appear in the next listbox row. 但随后看到However, if a second set of **contact info** is saved, it overwrites the first one, rather than appending it.-- 我被困在这里,是&lt;Contact /&gt;联系信息 还是第二组你的意思是对同一记录的更新?。我认为,如果您在编辑中发布了您正在描述的代码,这也将有助于澄清,这首先会创建 xml。
  • 尝试.ToList () 或找到一种方法将这个“XelementCollection”转换为支持它的枚举。您收到此异常是因为无论 var 解析为什么类型,都不会实现 IList

标签: c# xml listbox indexing


【解决方案1】:

有一种更简单的方法可以使用 Dictionary 对象进行绑定

var dic = (from order in ds.Tables[0].AsEnumerable()
                   select new
                   {
                       UserView = order.Field<String>("Value"),
                       DevView = order.Field<String>("id")

                   }).AsEnumerable().ToDictionary(k => k.DevView, v => v.UserView);
                    ListBox1.DataSource = dic;
                    ListBox1.DataTextField = "Value";
                    ListBox1.DataValueField = "key";
                    ListBox1.DataBind();

Reference Link

【讨论】:

    【解决方案2】:

    您可以使用XDocument 来表示您的XML 文档并迭代其中的每个项目。以您为例,

    您可以为Contact 创建一个对象,其中您将拥有NameCityStatePhone 属性。

    var xDoc = XDocument.Load("ContactBook.xml");
    var listBoxItems = xDoc.Elements("Contact"); //This will be a list of IEnumerable<XElement> child elements of Contact xml tag
    

    然后你可以通过你的代码来操作这些东西。

    编辑:

    listBox1.DataSource = listBoxItems.ToList();
    listBox1.DisplayMember = "Value";
    listBox1.ValueMember = "Value";
    

    【讨论】:

    • XDocument 是否有特定的 using 语句?我有 System.IO;和 System.Xml;
    • 是的。如果您从XDocument 查看我上面的附加链接。你需要添加它的命名空间System.Xml.Linq
    • System.Xml.Linq.XContainer+d_11 这就是我输入时得到的:listbox1.Items.Add(listBoxItems);
    • 而不是Items.Add()方法,你可以设置它的DataSource值。查看我的编辑。
    • 查看我的答案更新。我们可以使用.ToList()扩展方法将IEnumerable转换为List对象。
    【解决方案3】:

    如果您想要在列表框中显示某个“联系人”对象的“成员”(以及我猜它们的值),一种方法可能是为“联系人”对象创建一个类,为“联系人”对象创建另一个类。成员”:

    class Contact
    {
        public IList<ObjectMember> Members { get; set; }
    }
    
    class ObjectMember
    {
        public string Name { get; set; }
        public string Value { get;set; }
    }
    

    这些类可能也有助于处理对话框中的字段。

    然后,当您阅读 xml 时,您将一个新的 ObjectMember 实例化到您的成员列表中 Add (或者任何可以为您提供的东西!)。 Linq to Xml 可能是最简单、最有趣的方式了。

    当您拥有所有成员时,您可以将您的ListBox 绑定到联系人的Members 列表,但具体实现取决于您是在 WinForms 还是 WPF 领域.

    【讨论】:

    • 我设置了一个类来实例化对象成员。不过谢谢!
    【解决方案4】:

    这是我加载 XML 的方式:

    System.Data.DataSet ds = new System.Data.DataSet();
    ds.ReadXml(HttpContext.Current.Server.MapPath("~/App_Data/Lang.xml"));
    

    希望这对您有所帮助。

    【讨论】:

    • 嗯,问题是,我试图让列表框的每一行获得一个由每个单元格组成的字符串的值,所以不,抱歉。这并没有真正帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多