【问题标题】:Can't add items to ListView from my XMLs in WPF无法从 WPF 中的 XML 向 ListView 添加项目
【发布时间】:2012-03-12 23:20:37
【问题描述】:

主要问题是这个。

我有 2 个 XML,其中包含有关我公司的业务的信息。一种被认为是模板 XML,您可以在其中找到一般信息,另一种是包含有关每个单独设备的信息的目录,其中包含对模板 XML 的引用。

它们看起来像这样 目录 XML

<list>
   <A>
      <B>
        <c>reference to template</c>
        <d>info 2</d>
        <e>info 3</e>
        <f>info 4</f>
        <g>
            <h>info5</h>
            <i>info5</i>
        </g>
      </B>
      <B>
        <c>reference to template</c>
        <d>info a</d>
        <e>info s</e>
        <f>info d</f>
        <g>
            <h>infof</h>
            <i>infog</i>
        </g>
      </B>
      <B>
        <c>reference to template</c>
        <d>info h</d>
        <e>info j</e>
        <f>info k</f>
        <g>
            <h>infot</h>
            <i>infoy</i>
        </g>
      </B>
   </A>
</list>

模板

<list>
   <R>
      <S>
        <t>info 7</t>
        <u>info 8</u>
        <v>info 9</v>
        <w>info 10</w>
      </S>
   </R>
</list>

我需要做的是显示一个列表视图中编目的所有设备,这将点亮来自两个 XML 的信息。

我试过了,没有成功,我只能展示一件装备,但实际上并没有展示出来,出现的都是无形的信息。 我使用这个来遍历两个 XML:

xDocument load = xDocument.load("Myxml.xml");
var run = (from x in load.Descendants("A")
           where x.Element("c").Value == comboBox1.SelectedItems.ToString()
           select new
           {
             a = x.Element("d").Valuye.ToString(),
             //here I gather the rest of the information
           }).ToList();
listView.Items.Add(run);
//after that I tried listview.Items.Add(run.a) ... but the code which I use to run through
//ends with FirstorDefault(), instead of ToList() and I try adding all the components manually

唯一出现的是一个隐形装备,也就是说当我点击它时我可以看到那里有东西,但我就是看不到信息。

所以我尝试使用相同的方法添加字符串,但得到了相同的结果。

谁能告诉我我的错误在哪里?我看不到它。

PS:在我设法做到这一点之后,我将实现一个功能,通过双击信息,客户端将能够更改信息。如果有人知道从哪里开始,请指出正确的方向

【问题讨论】:

    标签: c# wpf xml linq


    【解决方案1】:

    我相信您的 l​​inq 查询需要一些修饰,例如:

    xDocument load = xDocument.load("Myxml.xml");
    var run = (from x in load.Descendants("B")
           where x.Element("c") == comboBox1.SelectedItems.ToString()
           select new
           {
             a = x.Element("d").Valuye.ToString(),
             //here I gather the rest of the information
           }).ToList();
    

    另外,您应该尝试在列表中使用 for 循环并逐个添加字符串

    foreach (var item in run)
        listView.Items.Add(item.a);
    

    您可以在此 MSDN 页面上查看 Add 方法的不同重载:

    http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.listviewitemcollection.aspx

    【讨论】:

    • 我已经尝试过了,但没有成功。我得到的只是我之前所说的“不可见”内容
    【解决方案2】:

    说实话,我不完全确定问题是什么。不过,我会尝试XDocument 查询。

    进行比较时,需要比较正确的类型。示例中的比较甚至无法编译,因为 XElementString 的比较:

    where x.Element("c") == comboBox1.SelectedItems.ToString()
    

    应该是:

    where x.Element("c").Value == comboBox1.SelectedItems.ToString()
    

    如果总体目标是从查询中获取字符串列表,请查看以下内容:

    string match = comboBox1.SelectedItems.ToString();
    
    var doc = XDocument.Load( "MyXml.xml" );
    
    var query = doc.Descendants( "B" )
        .Where( x => x.Element( "c" ).Value == match )
        .Select( x => x.Element( "d" ).Value )
        .ToList();
    

    请注意,查询以“B”元素开头。从 "A" 元素开始将导致在 where 子句中匹配 0 个元素。

    此外,通过使用附加变量来分解语句更容易分解这些类型的问题,即匹配条件、XDocument、查询等的变量……甚至查询也可以是如果需要,可以分解为进一步的子查询。

    这应该让你开始。

    【讨论】:

    • 对不起,我在这里输入了错误的代码,但在真正的程序中,我以正确的方式进行了操作。而且,我尝试手动添加值,而不是来自 XML,而是我刚当场制作的数据。我尝试复制示例以添加项目,但它们不起作用
    • 您需要发布真实的代码示例,以揭示您难以解决的问题。尝试用问题中的实际代码重新措辞您的问题。如果您一次只回答一个问题会更容易。
    【解决方案3】:

    如果您使用列表视图的Detail模式,您需要在列表中添加columns,并在每列对应的项目中添加subitems,否则您的项目将“不可见”。

    请参阅ListView.ColumnsListViewItem.SubItems 成员了解更多详情。

    【讨论】:

    • 我已经用listview添加了列,当我创建一个listvieitem时,我只是没有得到subitems方法或属性,它只是说它不适用于listviewitem
    【解决方案4】:

    我发现出了什么问题,我需要添加一个 observable 集合,我在其中添加了我想放在 viewlist 上的内容,然后我将信息放在 viewlist 中的 observablecollection 中。

    感谢大家帮助我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      相关资源
      最近更新 更多