【发布时间】:2023-03-13 00:27:01
【问题描述】:
男孩女孩们下午好!我正在尝试学习 c#(WPF) 大约 2 周,我遇到了一些谷歌到目前为止没有帮助我解决的问题:/
假设我有一个随机的 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<XML>
<ADRESSE>
<NAME1>John</NAME1>
<NAME2>Doe</NAME2>
<STRASSE1>Heystreet</STRASSE1>
<STRASSE2>9</STRASSE2>
<LAND>AUT</LAND>
<PLZ>1050</PLZ>
<ORT>Vienna</ORT>
</ADRESSE>
</XML>
假设这个 XML 有 100 个条目。
现在我将在我的 XAML 中创建一个名为“lv1”的简单列表视图和一个按钮。
int counter = 0;
GridView gv1 = new GridView();
XDocument rndfile = XDocument.Load(@"C:\Users\...\random.xml");
foreach (XElement xele in rndfile.Descendants("ADRESSE")) //#1
{
GridViewColumn gvc = new GridViewColumn();
gvc.DisplayMemberBinding = new Binding("Feld"+counter);
gvc.Header = xele.Name.LocalName; // #2
gv1.Columns.Add(gvc);
string feldx = string.Format(@"Feld{0}", counter);
// MessageBox.Show(feldx+"||"+"Feld"+counter); //was for me to test if names are identical
lv1.Items.Add(new { feldx = xele.Element("Childelement of ADRESSE").Value }); //#3+4
counter++;
}
lv1.View = gv1;
1 和 3 是我的实际问题,我猜 1 和 2 是一样的。
所以基本上我想要做的是按下按钮,加载 XML 并为 ADRESSE 的每个子级创建一个具有当前子级名称的列,并直接用 XML 内容填充它。
我现在遇到的问题:#1 foreach 循环仅针对每个名为 ADRESSE 的条目而不是它的每个子元素运行,我只是无法弄清楚如何在不破坏任何语法的情况下获取它的子元素(尝试使用Elements() 但他不喜欢循环中的那个).. 所以现在上面的 XML 只会创建 1 行而不是 7 行,因为文件中只有一个 ADRESSE 条目。
对于第二个问题,我想用 XML 的子名命名列,但由于 #1 的问题,它不会按预期工作。 (或者这种想法通常是错误的?)
第三个问题是列的动态填充。据我所见,lv1.Items.Add({...}) 不接受上面的feldx,但认为它是一个自己的名称并且没有正确填写它,因为没有名为 feldx 的列绑定。对于#4,我需要feldx = xele.Element(@"{0}", ChildName).Value这样的内容来获取列的正确内容
我真的试图自己寻找和解决这个问题,但我在 XML 或 gridviews here 或 mycsharp/msdn 上找到的所有东西要么只有静态(硬编码)XAML 条目和绑定,要么只是你知道什么的 XML 文件那里的条目(所以实际上又是硬编码的)。所以我只是希望我的要求不要太露骨,有人可以启发我一点
编辑#1:
var rootele = rndfile.Root.Element("ADRESSE").Elements(); //<-- worked like a charm. My problem was that i tried to fiddle this into the foreach loop itself, which wasn't accepted somehow - so many thanks har07
int counter = 0;
foreach (XElement xele in rootele)
{
GridViewColumn gvc = new GridViewColumn();
gvc.DisplayMemberBinding = new Binding("Feld"+counter);
gvc.Header = xele.Name.LocalName;
gv1.Columns.Add(gvc);
lv1.Items.Add(new { feld_x_ = xele.Element("Childelement of ADRESSE").Value }); // <-- for this i am trying to find a solution and post it again, or maybe someone else knows how to add a changing Binding Name into the .Add()
counter++;
}
lv1.View = gv1;
【问题讨论】: