2

我正在尝试将单个“行”的 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 

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

4

4 回答 4

2

您可以使用XDocument可以表示 XML 文档的位置并迭代其中的每个项目。对于你的例子,

您可以为 a 创建一个对象,Contact其中您将拥有 a 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";
于 2013-04-17T02:48:02.597 回答
0

这是我加载 XML 的方式:

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

希望这对您有所帮助。

于 2013-04-17T02:43:52.507 回答
0

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

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

class ObjectMember
{
    public string Name { get; set; }
    public string Value { get;set; }
}

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

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

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

于 2013-04-17T03:31:16.587 回答
0

有一种更简单的方法可以使用 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();

参考链接

于 2015-02-16T09:26:47.853 回答