Search code examples
c#wpfdatagrid

ShowDialog() on a Window with a Datagrid throws a dividebyzero error


I have found a weird bug I can't even find where it's coming from:

I have a window with a DataGrid bound to a static resource filled from a dataset:

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">

But the method that fills the ViewSource is not called before the user presses a button, so all I'd get is an empty DataGrid. Also, calling ShowDialog() on this window works flawlessly.

The issue arises when the user goes through a series of pages shown on a navigation frame, which, in turn, is on a different window. Those two windows cannot be opened at the same time.

These pages collect data, in form of bound read-only comboboxes, textboxes and checkboxes, setting Properties.Settings.Default parameters at the end of each page. Such a page is:

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

The issue arises after the user finished writing the settings to the settings file. When trying to run ShowDialog() on the previous window (the one with the DataGrid), it throws a System.DivideByZeroException, with the following stacktrace:

   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()

I cannot find exactly what is being divided by zero and why this error is triggered only after running the settings assistant...

New projects show Datagrids normally; running the software without going through the pages allows the software to run normally; running on another computer works fine;

Any hints on how to debug this?

EDIT: New information found. I found exactly what triggers the exception. One of the windows calls a method from an external C++ dll, via a string response = Marshal.PtrToStringAnsi(DllMethods.Query(31298)) method.

DllMethods is a class that interfaces with the external dll, and, more specifically, the used method reads as:

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

After the Marshal method is called, whenever a datagrid is to be rendered, the ShowDialog() method throws the System.DivideByZeroException.

SECOND EDIT: I've found why I was getting this error. The DllImport was first looking on the SysWOW64 folder for the dllsat.dll, where there was a wrong and old version of this dll. When I removed that file from SysWOW64, and forced the build action to "copy always" the correct version of the dll, it worked flawlessly.

Should I post this as an answer to my own question?


Solution

  • I've found why I was getting this error. The DllImport was first looking on the SysWOW64 folder for the dllsat.dll, where there was a wrong and old version of this dll. When I removed that file from SysWOW64, and forced the build action to "copy always" the correct version of the dll, it worked flawlessly.

    Posting here as an answer as per Steffen's suggestion.