ShowDialog () в окне с сеткой данных выдает ошибку divbyzero - PullRequest
0 голосов
/ 21 февраля 2019

Я нашел странную ошибку, которую даже не могу найти, откуда она взялась:

У меня есть окно с DataGrid, привязанным к статическому ресурсу, заполненному из набора данных:

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 () в этом окне работает безупречно.

Проблема возникает, когда пользователь просматривает серию страниц, отображаемых в кадре навигации, который, в свою очередь, находится в другом окне.Эти два окна не могут быть открыты одновременно.

Эти страницы собирают данные в виде связанных списков, доступных только для чтения, текстовых полей и флажков, устанавливая параметры 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();
         }
    }

Проблема возникает после того, как пользователь завершил запись настроек в файл настроек.При попытке запустить ShowDialog () в предыдущем окне (с DataGrid) выдается 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 отображаются нормально;запуск программного обеспечения без просмотра страниц позволяет программному обеспечению нормально работать;работа на другом компьютере работает нормально;

Любые советы о том, как отладить это?

РЕДАКТИРОВАТЬ: Новая информация найдена.Я нашел точно , что вызывает исключение.Одно из окон вызывает метод из внешней библиотеки C ++, используя метод string response = Marshal.PtrToStringAnsi(DllMethods.Query(31298)).

DllMethods - это класс, который взаимодействует с внешней библиотекой DLL, и, более конкретно, используемый метод выглядит так:

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

После вызова метода Marshal при каждом отображении сетки данных метод ShowDialog() выдает System.DivideByZeroException.

ВТОРОЕ РЕДАКТИРОВАНИЕ: Я нашел почему Я получил эту ошибку.DllImport сначала просматривал папку SysWOW64 для dllsat.dll, где была неправильная и старая версия этой dll.Когда я удалил этот файл из SysWOW64 и заставил действие сборки «всегда копировать» правильную версию dll, оно работало безупречно.

Должен ли я опубликовать это как ответ на свой вопрос?

1 Ответ

0 голосов
/ 22 мая 2019

Я нашел, почему я получаю эту ошибку.DllImport сначала просматривал папку SysWOW64 для dllsat.dll, где была неправильная и старая версия этой dll.Когда я удалил этот файл из SysWOW64 и заставил действие сборки «всегда копировать» правильную версию dll, оно работало безупречно.

Размещение здесь в качестве ответа согласно предложению Стеффена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...