2010-06-29 65 views
0

我使wpf應用程序運行良好。但是,無論何時我的xml的大小很大,它的運行速度非常慢,我們每次從xml獲取數據時,代碼如下 是任何機構建議我就是因爲這樣,也可以是其他的問題如何優化wpf應用程序的性能

我如何改革這個 感謝 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; 

       } 

      }` 

回答

1

哎喲!

你在用什麼DataTable ?!這對於這個目的來說效率非常低,需要你編寫大量額外的代碼。另外,爲什麼從代碼設置ComboBox屬性而不是在XAML中?

一個非常非常簡單的方法是你的組合框直接綁定到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的技術更好,但要加你的「選擇事件」行會要求CompositeCollection是添加。這是可以做到的,但...

最好的解決方法是使用LINQ到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到XML解決方案的速度比綁定到XML,這反過來比使用DataTable更快。不僅如此,LINQ to XML解決方案比其他兩個更清潔。