我使一个wpf应用程序运行良好。但每当我的xml的大小很大时,每当我们从xml获取数据时,它的运行速度非常慢,如下面的代码 是任何机构建议我这是因为这或可能是其他问题
我怎么能改革这一点 谢谢 shashank`
DataSet xmlData = new DataSet();
XmlTextReader reader = null;
try
{
if (File.Exists(CommonUtils.xmlPath))
{
//convert XmlDocument to XmlTextReader
reader = new XmlTextReader(new StringReader(CommonUtils.DecryptXML().OuterXml));
//get the xml data
xmlData.ReadXml(reader);
reader.Close();
//get category rows from
DataRow[] eventRows = xmlData.Tables["M_EVENT"].Select(" ROW_STATUS=1");
if (eventRows.Length > 0)
{
//create a datatable for event
DataTable dtEvent = xmlData.Tables["M_EVENT"].Clone();
//add a default row to the event table
DataRow dr = dtEvent.NewRow();
dr[0] = "-1";
dr[1] = "--Select Event--";
dr[2] = "1";
dtEvent.Rows.InsertAt(dr, 0);
foreach (DataRow row in eventRows)
{
DataRow drEvent = dtEvent.NewRow();
drEvent["PK_EVENT_ID"] = row["PK_EVENT_ID"];
drEvent["EVENT_NAME"] = row["EVENT_NAME"];
drEvent["EVENT_TYPE"] = row["EVENT_TYPE"];
dtEvent.Rows.Add(drEvent);
}
//bind the category drop down
cmbEvent.DataContext = dtEvent.DefaultView;
cmbEvent.SelectedValuePath = "PK_EVENT_ID";
cmbEvent.DisplayMemberPath = "EVENT_NAME";
cmbEvent.SelectedIndex = 0;
}
}
else
{
Lblgetevent.Visibility = Visibility.Visible;
}
}`
答案 0 :(得分:1)
哎哟!
你在使用DataTable做什么?!对于此目的而言,它非常低效,并且需要您编写大量额外代码。另外,为什么要从代码而不是XAML中设置ComboBox属性?
更简单的方法是将ComboBox直接绑定到XML:
<ComboBox ItemsSource="{Binding EventXml, XPath=M_EVENT[ROW_STATUS=1]}"
...>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding XPath=EVENT_NAME}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
这比DataTable技术更好,但添加“Select Event”行将需要添加CompositeCollection。这可以做到,但是......
最好的解决方案是使用LINQ to XML:
public object Events
{
get
{
return new[] { new { Name = "--Select Event--", Id = -1 }}.Concat(
from element in EventsXml.Elements("M_EVENT")
where element.Element("ROW_STATUS").Value=="1"
select new
{
Name = element.Element("EVENT_NAME").Value,
Id = int.Parse(element.Element("PK_EVENT_ID").Value),
});
}
}
使用这个简单的XAML:
<ComboBox ItemsSource="{Binding Events}" SelectedValuePath="Id" ...>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
LINQ to XML解决方案比绑定到XML更快,而这反过来比使用DataTable更快。不仅如此,LINQ to XML解决方案比其他两个解决方案更清晰。