WPF Datagrid在标头排序时崩溃

时间:2017-12-13 15:56:06

标签: c# wpf binding datagrid

此问题与What is it about DataTable Column Names with dots that makes them unsuitable for WPF's DataGrid control?相关。

我正在使用数据网格来显示即席查询构建器的结果,因此数据表列可以是任何内容。

我以最多票数回答了答案(14)。一切都很好,但如果我点击标题对列进行排序,整个应用程序崩溃。

错误:

System.IndexOutOfRangeException   HResult=0x80131508   Message=Index was outside the bounds of the array.   Source=AppName   StackTrace:    at AppName.App.ShowUnhandeledException(DispatcherUnhandledExceptionEventArgs e) in <path>\App.xaml.cs:line 51    at AppName.App.AppDispatcherUnhandledException(Object sender, DispatcherUnhandledExceptionEventArgs e) in <path>\App.xaml.cs:line 27 at System.Windows.Threading.Dispatcher.CatchException(Exception e)    at System.Windows.Threading.Dispatcher.CatchExceptionStatic(Object source, Exception e)    at System.Windows.Threading.ExceptionWrapper.CatchException(Object source, Exception e, Delegate catchHandler)    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)  at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)    at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)    at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)    at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)   at System.Windows.Application.RunDispatcher(Object ignore)    at System.Windows.Application.RunInternal(Window window)    at System.Windows.Application.Run(Window window)    at System.Windows.Application.Run()    at AppName.App.Main()

这是我的XAML:

<DataGrid x:Name="DgridQueryResults" Grid.Row="1" Background="LightGray" Margin="5" ItemsSource ="{Binding .}" IsReadOnly="True" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="true" CanUserReorderColumns="False" CanUserSortColumns="True" ClipboardCopyMode="ExcludeHeader"SelectionUnit="Cell" CopyingRowClipboardContent="DgridQueryResults_CopyingRowClipboardContent" Grid.ColumnSpan="2"/>                             

我尝试了上面的项目来源就像ItemsSource =“{Binding}” 但它仍然崩溃。

我以编程方式添加括号如下:

        private void DgridQueryResults_ColumnSetup()
    {
        DgridQueryResults.Columns.Clear();
        DgridQueryResults.AutoGenerateColumns = false;
        foreach (DataColumn column in _results.Columns)
        {
            var gridColumn = new DataGridTextColumn()
            {
                Header = column.ColumnName,
                Binding = new Binding("[" + column.ColumnName + "]")
            };

            DgridQueryResults.Columns.Add(gridColumn);
        }
    }

我在设置项目源之前设置了列,如下所示:

        private void ExecuteSql()
    {
        if (_dataFormData.GetDataViaReader(_sql))
        {
            _results = _dataFormData.DT;
            DgridQueryResults_ColumnSetup();// <-- column setup
            DgridQueryResults.DataContext = _results.DefaultView;

        }
        else
        {
            DgridQueryResults.DataContext = null;
        }

        QueryResults.Focus();
    }

注释掉列设置工作正常,但是我不能让列名违反绑定(即完全停止(。))。

在XAML中将设置用户排序设置为false也会修复它,但当然,用户无法对数据进行排序。

我正在使用VS 2017 15.5.1对抗Framework 4.6.1。

还有其他人在体验这个吗?我感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

我明白了。添加列时,我必须添加排序成员路径。

private void DgridQueryResults_ColumnSetup()
{
    DgridQueryResults.Columns.Clear();
    DgridQueryResults.AutoGenerateColumns = false;
    foreach (DataColumn column in _results.Columns)
    {
        var gridColumn = new DataGridTextColumn()
        {
            Header = column.ColumnName,
            SortMemberPath = column.ColumnName, //<--added
            Binding = new Binding("[" + column.ColumnName + "]")
        };


        DgridQueryResults.Columns.Add(gridColumn);
    }
}