2010-06-29 4 views
0

Я делаю приложение wpf своим ходом. Но всякий раз, когда размер моего xml до больших, он работает очень медленно каждый раз, когда мы извлекаем данные из xml, как код ниже - это любое предложение тела меня это из-за этого или может быть другая проблемаКак оптимизировать производительность приложения wpf

как я могу реформировать эту Thanks 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?

Гораздо, гораздо более простой способ, чтобы связать ваш 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 к 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 намного чище, чем два других.

Смежные вопросы