我正在使用数据网格来显示即席查询构建器的结果,因此数据表列可以是任何内容。
我以最多票数回答了答案(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。
还有其他人在体验这个吗?我感谢任何帮助。谢谢!
答案 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);
}
}