【发布时间】:2018-05-27 14:14:40
【问题描述】:
我正在使用数据网格来显示临时查询构建器的结果,因此数据表列可以是任何内容。
我以最多票 (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。
还有其他人遇到这种情况吗?我很感激任何帮助。谢谢!
【问题讨论】: