【问题标题】:WPF Datagrid Crashes On Header SortWPF Datagrid在标题排序时崩溃
【发布时间】:2018-05-27 14:14:40
【问题描述】:

这个问题与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 也可以解决此问题,但当然,用户无法对数据进行排序。

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

还有其他人遇到这种情况吗?我很感激任何帮助。谢谢!

【问题讨论】:

    标签: c# wpf binding datagrid


    【解决方案1】:

    我想通了。添加列时我必须添加排序成员路径。

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 2010-11-20
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      相关资源
      最近更新 更多