2012-06-25 35 views
3

我在我的WPF應用程序WPF Datagrid中顯示不正確的數據,但正確地顯示時的columnHeader點擊

<DataGrid Name="datagrid2" ItemSource="{Binding}" CanUserReorderColumns="False" 
      IsReadOnly="True" SelectionMode="Single" CanUserResizeColumns="False" 
      CanUserResizeRows="False" LoadingRow="datagrid2_LoadingRow" /> 

DataGrid,我提供了ItemSource

datagrid2.ItemSource = mydatatable.DefaultView; 

及其作爲

的rowHeader
private void datagrid2_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    e.Row.Header = Some_string_araay[e.Row.GetIndex()]; 
} 

有時我的問題出現,rowheader變成第一列的數據。因此最後一列及其數據變爲無頭。我認爲這是一個佈局問題,所以在提供ItemSourceLoadingRow後,我做了datagrid2.UpdateLayout()。但問題依然如故。

enter image description here

enter image description here

當我點擊任何ColumnHeader,數據被正確對齊。

enter image description here

enter image description here

可能是什麼這個問題的原因和解決辦法?

+0

你可以發佈你的DataGrid的圖像(無haeaderless狀態)?很難想象究竟發生了什麼問題。並點擊哪個'ColumnHeader'解決了這個問題? – akjoshi

+0

@akjoshi:點擊​​任何columnheader可以正確地重新排列它們。 –

回答

2

好吧,我想我知道爲什麼會發生這種情況。

當網格加載時,第一列(具有行標題)的寬度根據其內容(行標題數據)在運行時確定。現在你的情況,當網格加載你的行標題沒有數據(你在LoadingRow事件中設置標題),所以第一列的寬度設置爲0;一旦更新行標題,它將不會被反映,因爲DataGrid不會自行刷新。

一旦你點擊一個列標題,它將重新計算RowHeader寬度,這次它是正確的,因爲你的行標題有數據。

應該有一些簡單的解決辦法這一點,但一個辦法做到這一點可以綁定你的RowHeaderWidthSelectAllButton(在0,0,細胞)像這樣 -

// Loaded event handler for Datagrid 
private void DataGridLoaded(object sender, RoutedEventArgs e) 
{ 
    datagrid2.LayoutUpdated += DataGridLayoutUpdated; 
} 

private void DataGridLayoutUpdated(object sender, EventArgs e) 
{ 
    // Find the selectAll button present in grid 
    DependencyObject dep = sender as DependencyObject; 

    // Navigate down the visual tree to the button 
    while (!(dep is Button)) 
    { 
     dep = VisualTreeHelper.GetChild(dep, 0); 
    } 

    Button selectAllButton = dep as Button; 

    // Create & attach a RowHeaderWidth binding to selectAllButton; 
    // used for resizing the first(header) column 
    Binding keyBinding = new Binding("RowHeaderWidth"); 
    keyBinding.Source = datagrid2; 
    keyBinding.Mode = BindingMode.OneWay; // Try TwoWay if OneWay doesn't work) 
    selectAllButton.SetBinding(WidthProperty, keyBinding); 

    // We don't need to do it again, Remove the handler 
    datagrid2.LayoutUpdated -= DataGridLayoutUpdated; 
} 

我已經做了類似的東西根據第0,0個單元格數據更改第一列的widht,它工作正常;希望這會對你有用。

+0

什麼是HandleMatrixDataGridLayoutUpdated? –

+0

哦,對不起,這是錯誤的錯誤;這是dataGrid的LayoutUpdated事件的事件處理程序。所有這些融合,因爲我繼承了DataGrid來創建自定義的DataGridControl。更新答案以適應您的情況。 – akjoshi