3

私はDataGrid私のwpfアプリに

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

そして私はそれItemSource

datagrid2.ItemSource = mydatatable.DefaultView;

とその行ヘッダーとして

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

行ヘッダーが最初の列のデータになるという問題が発生することがあります。したがって、最後の列とそのデータはヘッダーなしになります。レイアウトの問題だと思ったので、提供ItemSourceしてLoadingRowからdatagrid2.UpdateLayout()。しかし、問題は同じままです。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

いずれかをクリックするとColumnHeader、データが正しく配置されます。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

この問題の理由と解決策は何でしょうか?

4

1 に答える 1

2

わかりました、私はこれがなぜ起こっているのか知っていると思います。

最初の列(行ヘッダーを持つ)の幅は、グリッドが読み込まれるときの内容(行ヘッダーデータ)に基づいて実行時に決定されます。これで、グリッドが読み込まれるときに行ヘッダーにデータがないため(LoadingRowイベントでヘッダーを設定)、最初の列の幅が0に設定されます。行ヘッダーを更新すると、DataGridそれ自体は更新されないため、反映されません。

列ヘッダーをクリックすると、RowHeader幅が再計算されます。今回は、行ヘッダーにデータがあるため、これは正しいです。

これには簡単な解決策があるはずですが、これを行う1つの方法はRowHeaderWidth、次のようにSelectAllButton(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番目のセルデータに基づいて最初の列の幅を変更するのと同様のことを行いましたが、正常に機能します。これがあなたのために働くことを願っています。

于 2012-06-25T12:20:58.573 に答える