2010-06-29 5 views
0

je fais une application wpf son bon fonctionnement. Mais chaque fois que la taille de mon xml est trop grande, son fonctionnement est très lent chaque fois que nous récupérons des données de xml comme le code ci-dessous moi, c'est à cause de cela ou peut-être un autre problèmecomment optimiser les performances d'une application wpf

comment puis-je réformer ce grâce 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; 

       } 

      }` 

Répondre

1

Aïe!

Pour quoi utilisez-vous DataTable ?! Il est terriblement inefficace à cette fin et vous oblige à écrire beaucoup de code supplémentaire. En outre, pourquoi définissez-vous les propriétés ComboBox à partir du code et pas en XAML?

A beaucoup, beaucoup plus simple est de lier votre ComboBox directement au XML:

<ComboBox ItemsSource="{Binding EventXml, XPath=M_EVENT[ROW_STATUS=1]}" 
      ...> 
    <ComboBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding XPath=EVENT_NAME}" /> 
    </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Cela vaut mieux que la technique DataTable, mais pour ajouter votre ligne « Sélectionnez l'événement » nécessitera un CompositeCollection être ajoutée. Cela peut se faire, mais ...

La meilleure solution est d'utiliser LINQ pour 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), 
     }); 
    } 
} 

Avec ce simple XAML:

<ComboBox ItemsSource="{Binding Events}" SelectedValuePath="Id" ...> 
    <ComboBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding Name}" /> 
    </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

La solution LINQ to XML est plus rapide que liaison à XML, qui à son tour est plus rapide que l'utilisation de DataTable. Non seulement cela, mais la solution LINQ to XML est beaucoup plus propre que les deux autres.

Questions connexes