2016-09-07 43 views
0

我有一個包含GridView的ListView的應用程序C#/ WPF。我想讓內容創建一個包含所有值的CSV文件。獲取GridView的內容

我做了一些研究,但我只找到窗體或WPF DataGrid的解決方案。沒有GridView的。

我的列表:

<ListView Grid.Row="1" x:Name="myListView" 
      BorderBrush="White" HorizontalAlignment="Stretch" 
      ItemsSource="{Binding Path=myItem}" SelectedItem="{Binding Path=ActualItem}"> 
    <ListView.View> 
     <GridView x:Name="myGridView"> 

      <GridViewColumn Header="{x:Static p:Resources.NAME}" 
          DisplayMemberBinding="{Binding Path=Name,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" 
          Width="{StaticResource doubleNaN}"/> 

      <GridViewColumn Header="{x:Static p:Resources.LABEL}" 
          DisplayMemberBinding="{Binding Path=Label,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/> 

     </GridView> 
    </ListView.View> 
</ListView> 

我能得到頭,但沒有內容:

System.Text.StringBuilder csv = new System.Text.StringBuilder();       
String separator = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator; 

foreach (System.Windows.Controls.GridViewColumn col in myGridView.Columns) 
{ 
    string header = col.Header as String; 
    if (!String.IsNullOrWhiteSpace(header)) 
    { 
     csv.Append(header + separator); 
    } 
} 
csv.AppendLine(); 

System.IO.File.WriteAllText(path, csv.ToString()); 

我怎樣才能獲得的內容,使我的CSV文件?

+2

你填充的東西叫做'myItem' ListView控件從對象的屬性值。只需重複一遍即可。這就是內容所在的地方。另外,如果您想將內容添加到文件中,則必須編寫這樣的代碼。您現在添加的是列標題。 –

+1

我可以得到'myItem'列表,但'GridView'不顯示所有的屬性。如果'myItem'中的所有元素都爲null或空'NAME',我的'GridViewColumn'不顯示(width = 0),用戶也可以將寬度設置爲0.爲什麼我想從'GridView'中獲取值,得到只顯示的值 –

+2

所以有一些你需要重現的微不足道的邏輯。所以重現它。 GridView的目的不是爲CSV文件格式化值。試圖以這種方式使用它是糟糕的設計。具體來說,用業務邏輯糾纏UI控件是WPF和MVVM發明很大的一個典型的反模式,以引導您遠離。我很想賭這個代碼在事件處理程序中。 –

回答

0

我找到了一個解決方案,可能不是最好的,但它的工作原理。

的問題是:

  • 從GridView中獲得頭,因爲頭靠語言

  • 只得到顯示的列

項目在GridView控件是tyep MyItem和列包含屬性。我創建了一個循環來獲取來自GridView的標題和屬性。第二個循環得到ListView

System.Text.StringBuilder csv = new System.Text.StringBuilder();       
String separator = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator; 
List<String> listProperties = new List<string>(); 

csv.AppendLine("sep=" + separator); 

foreach (System.Windows.Controls.GridViewColumn col in myGridView.Columns) 
{ 

    // Check if column is displayed 
    if (col.ActualWidth > 0) 
    { 
     // Get Header value 
     string header = col.Header as String; 

     //Check if Header is not empty 
     if (!String.IsNullOrWhiteSpace(header)) 
     { 
      // Write in firte line 
      csv.Append(header + separator); 

      // Get if columns is binding a property 
      System.Windows.Data.Binding binding = col.DisplayMemberBinding as System.Windows.Data.Binding; 
      if (binding != null) 
      { 
       // Get the name of property 
       listProperties.Add(binding.Path.Path); 
      } 
     } 
    } 
} 
// Write first line 
csv.AppendLine(); 

foreach (myItem item in myListView.Items) 
{ 
    foreach (String property in listProperties) 
    { 
     // Get and write value for property 
     object value = GetPropValue(item, property); 
     csv.Append(value + separator); 
    } 
    csv.AppendLine(); 
} 

System.IO.File.WriteAllText(path, csv.ToString()); 



public static object GetPropValue(object src, string propName) 
{ 
    return src.GetType().GetProperty(propName).GetValue(src, null); 
}