c# - 带有 Datagrid 的窗口上的 ShowDialog() 抛出除零错误

标签 c# wpf datagrid

我发现了一个奇怪的错误,我什至找不到它的来源:

我有一个窗口,其中的 DataGrid 绑定(bind)到从数据集填充的静态资源:

WPF:

<Window.Resources>
    <PDV_WPF:FDBDataSet x:Key="fDBDataSet"/>
    <CollectionViewSource x:Key="sP_TRI_LISTAFECHAMENTOSViewSource" Source="{Binding SP_TRI_LISTAFECHAMENTOS, Source={StaticResource fDBDataSet}}"/>
</Window.Resources>
...
<DataGrid x:Name="sP_TRI_LISTAFECHAMENTOSDataGrid" 
Language="pt-BR" AutoGenerateColumns="False" ItemsSource="{Binding}" 
Margin="10" Grid.Row="2" HeadersVisibility="Column" 
IsReadOnly="True" PreviewKeyDown="sP_TRI_LISTAFECHAMENTOSDataGrid_PreviewKeyDown">

但是在用户按下按钮之前不会调用填充 ViewSource 的方法,所以我得到的只是一个空的 DataGrid。此外,在此窗口上调用 ShowDialog() 也能完美运行。

当用户浏览导航框架上显示的一系列页面时,问题就会出现,而导航框架又位于不同的窗口中。这两个窗口不能同时打开。

这些页面以绑定(bind)的只读组合框、文本框和复选框的形式收集数据,在每个页面的末尾设置 Properties.Settings.Default 参数。这样的页面是:

C#:

    public setupSpooler()
    {
        InitializeComponent();
        foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
        {
            cbb_printers.Items.Add(printer);
        }
    }

    private void cbb_printers_DropDownClosed(object sender, EventArgs e)
    {
        if (cbb_printers.SelectedIndex.ToString() != "-1")
        {
            Properties.Settings.Default.ImpressoraUSB = cbb_printers.SelectedItem.ToString();
            Properties.Settings.Default.Save();
            Properties.Settings.Default.Reload();
         }
    }

问题出现在用户完成将设置写入设置文件后。当尝试在前一个窗口(带有 DataGrid 的窗口)上运行 ShowDialog() 时,它会抛出一个 System.DivideByZeroException,并具有以下堆栈跟踪:

   em System.Windows.Controls.VirtualizingStackPanel.MeasureOverrideImpl(Size constraint, Nullable`1& lastPageSafeOffset, List`1& previouslyMeasuredOffsets, Nullable`1& lastPagePixelSize, Boolean remeasure)
   em System.Windows.Controls.VirtualizingStackPanel.MeasureOverride(Size constraint)
   em System.Windows.Controls.Primitives.DataGridRowsPresenter.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
   em System.Windows.Controls.ItemsPresenter.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
   em System.Windows.Controls.ScrollContentPresenter.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV)
   em System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV, Boolean& hasDesiredSizeUChanged)
   em System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV)
   em System.Windows.Controls.Grid.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em System.Windows.Controls.ScrollViewer.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em System.Windows.Controls.Border.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em System.Windows.Controls.Control.MeasureOverride(Size constraint)
   em System.Windows.Controls.DataGrid.MeasureOverride(Size availableSize)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV)
   em System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV, Boolean& hasDesiredSizeUChanged)
   em System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV)
   em System.Windows.Controls.Grid.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV)
   em System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV, Boolean& hasDesiredSizeUChanged)
   em System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV)
   em System.Windows.Controls.Grid.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em System.Windows.Controls.Border.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em System.Windows.Controls.Border.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
   em System.Windows.Controls.ContentPresenter.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em System.Windows.Documents.AdornerDecorator.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em System.Windows.Controls.Border.MeasureOverride(Size constraint)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em System.Windows.Window.MeasureOverrideHelper(Size constraint)
   em System.Windows.Window.MeasureOverride(Size availableSize)
   em System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   em System.Windows.UIElement.Measure(Size availableSize)
   em System.Windows.Interop.HwndSource.SetLayoutSize()
   em System.Windows.Interop.HwndSource.set_RootVisualInternal(Visual value)
   em System.Windows.Interop.HwndSource.set_RootVisual(Visual value)
   em System.Windows.Window.SetRootVisual()
   em System.Windows.Window.SetRootVisualAndUpdateSTC()
   em System.Windows.Window.SetupInitialState(Double requestedTop, Double requestedLeft, Double requestedWidth, Double requestedHeight)
   em System.Windows.Window.CreateSourceWindow(Boolean duringShow)
   em System.Windows.Window.CreateSourceWindowDuringShow()
   em System.Windows.Window.SafeCreateWindowDuringShow()
   em System.Windows.Window.ShowHelper(Object booleanBox)
   em System.Windows.Window.Show()
   em System.Windows.Window.ShowDialog()
   em PDV_WPF.Telas.Caixa.<>c__DisplayClass80_0.<MainWindow_KeyDown>b__14(Object p) na M:\TrilhaWS\InfoSales\PDV_PRINCIPAL\Telas\Caixa.xaml.cs:linha 1311
   em PDV_WPF.DebounceDispatcher.<>c__DisplayClass5_0.<Debounce>b__0(Object s, EventArgs e) na M:\TrilhaWS\InfoSales\PDV_PRINCIPAL\Funcoes\PublicFunc.cs:linha 2062
   em System.Windows.Threading.DispatcherTimer.FireTick(Object unused)
   em System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   em System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   em System.Windows.Threading.DispatcherOperation.InvokeImpl()
   em System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   em MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
   em System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   em MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
   em System.Windows.Threading.DispatcherOperation.Invoke()
   em System.Windows.Threading.Dispatcher.ProcessQueue()
   em System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   em MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   em MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   em System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   em System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   em System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   em MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   em MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   em System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   em System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   em System.Windows.Application.RunDispatcher(Object ignore)
   em System.Windows.Application.RunInternal(Window window)
   em System.Windows.Application.Run(Window window)
   em System.Windows.Application.Run()
   em PDV_WPF.App.Main()

我找不到确切的什么被零除以及为什么只有在运行设置助手后才会触发此错误...

新项目正常显示Datagrids;不经过页面运行软件,软件可以正常运行;在另一台计算机上运行正常;

关于如何调试这个的任何提示?

编辑:发现新信息。我找到了正是触发异常的原因。其中一个窗口通过 string response = Marshal.PtrToStringAnsi(DllMethods.Query(31298)) 方法从外部 C++ dll 调用方法。

DllMethods 是一个与外部 dll 接口(interface)的类,更具体地说,使用的方法如下:

[DllImport("dllsat.dll", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr Query(int sessionNo);

调用 Marshal 方法后,每当要呈现数据网格时,ShowDialog() 方法都会抛出 System.DivideByZeroException

第二次编辑:我找到了为什么我收到这个错误。 DllImport 首先在 SysWOW64 文件夹中查找 dllsat.dll,其中存在错误的旧版本 dll。当我从 SysWOW64 中删除该文件并强制构建操作“始终复制”dll 的正确版本时,它运行完美。

我应该将此作为我自己问题的答案发布吗?

最佳答案

我已经找到我收到此错误的原因。 DllImport 首先在 SysWOW64 文件夹中查找 dllsat.dll,其中存在错误的旧版本 dll。当我从 SysWOW64 中删除该文件并强制构建操作“始终复制”dll 的正确版本时,它运行完美。

根据 Steffen 的建议张贴在这里作为答案。

关于c# - 带有 Datagrid 的窗口上的 ShowDialog() 抛出除零错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54812514/

相关文章:

c# - 服务结构参与者超时

c# - Xamarin Forms 动态添加 shell 项

c# - 在 C# dockerfile 中运行可执行文件

c# - 如何从 wpf 中的 DataGridCellinfo 类中提取 DataGridCell

c# - 如何从 C# 代码中拉伸(stretch) DataGrid 列?

c# - 如何让 AutoFixture AutoMoq 从实例化对象中的注入(inject)服务返回结果?

c# - 在绑定(bind)字符串上使用时无法使简单转换器工作

wpf - 如何在 WPF/Silverlight 中设置页眉/行

c# - 使用以编程方式创建的设置任务栏覆盖图标

c# - 从 ViewModel 向 View 发送命令是否违反了 MVVM?