2

実際にはカスタム コントロールである DatagridViewNumericUpDownColumn を作成しましたが、フォームを閉じて再度開くとエラー メッセージが表示されました。

破棄されたオブジェクトにアクセスできません。オブジェクト名: 'NumericUpDown'

私はnumericupdownのために次のコードを書いています

[ThreadStatic]
        private static NumericUpDown paintingNumericUpDown; 

 protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState,
                                      object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle,
                                      DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            try
            {
                if (this.DataGridView == null)
                {
                    return;
                }

                // First paint the borders and background of the cell.
                base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle,
                           paintParts & ~(DataGridViewPaintParts.ErrorIcon | DataGridViewPaintParts.ContentForeground));

                Point ptCurrentCell = this.DataGridView.CurrentCellAddress;
                bool cellCurrent = ptCurrentCell.X == this.ColumnIndex && ptCurrentCell.Y == rowIndex;
                bool cellEdited = cellCurrent && this.DataGridView.EditingControl != null;

                // If the cell is in editing mode, there is nothing else to paint
                if (!cellEdited)
                {
                    if (PartPainted(paintParts, DataGridViewPaintParts.ContentForeground))
                    {
                        // Paint a NumericUpDown control
                        // Take the borders into account
                        Rectangle borderWidths = BorderWidths(advancedBorderStyle);
                        Rectangle valBounds = cellBounds;
                        valBounds.Offset(borderWidths.X, borderWidths.Y);
                        valBounds.Width -= borderWidths.Right;
                        valBounds.Height -= borderWidths.Bottom;
                        // Also take the padding into account
                        if (cellStyle.Padding != Padding.Empty)
                        {
                            if (this.DataGridView.RightToLeft == RightToLeft.Yes)
                            {
                                valBounds.Offset(cellStyle.Padding.Right, cellStyle.Padding.Top);
                            }
                            else
                            {
                                valBounds.Offset(cellStyle.Padding.Left, cellStyle.Padding.Top);
                            }
                            valBounds.Width -= cellStyle.Padding.Horizontal;
                            valBounds.Height -= cellStyle.Padding.Vertical;
                        }
                        // Determine the NumericUpDown control location
                        valBounds = GetAdjustedEditingControlBounds(valBounds, cellStyle);

                        bool cellSelected = (cellState & DataGridViewElementStates.Selected) != 0;

                        if (renderingBitmap.Width < valBounds.Width ||
                            renderingBitmap.Height < valBounds.Height)
                        {
                            // The static bitmap is too small, a bigger one needs to be allocated.
                            renderingBitmap.Dispose();
                            renderingBitmap = new Bitmap(valBounds.Width, valBounds.Height);
                        }
                        // Make sure the NumericUpDown control is parented to a visible control
                        if (paintingNumericUpDown.Parent == null || !paintingNumericUpDown.Parent.Visible)
                        {
                            paintingNumericUpDown.Parent = this.DataGridView;
                        }
                        // Set all the relevant properties
                        paintingNumericUpDown.TextAlign = DataGridViewNumericUpDownCell.TranslateAlignment(cellStyle.Alignment);
                        paintingNumericUpDown.DecimalPlaces = this.DecimalPlaces;
                        paintingNumericUpDown.ThousandsSeparator = this.ThousandsSeparator;
                        paintingNumericUpDown.Font = cellStyle.Font;
                        paintingNumericUpDown.Width = valBounds.Width;
                        paintingNumericUpDown.Height = valBounds.Height;
                        paintingNumericUpDown.RightToLeft = this.DataGridView.RightToLeft;
                        paintingNumericUpDown.Location = new Point(0, -paintingNumericUpDown.Height - 100);
                        paintingNumericUpDown.Text = formattedValue as string;

                        Color backColor;
                        if (PartPainted(paintParts, DataGridViewPaintParts.SelectionBackground) && cellSelected)
                        {
                            backColor = cellStyle.SelectionBackColor;
                        }
                        else
                        {
                            backColor = cellStyle.BackColor;
                        }
                        if (PartPainted(paintParts, DataGridViewPaintParts.Background))
                        {
                            if (backColor.A < 255)
                            {
                                // The NumericUpDown control does not support transparent back colors
                                backColor = Color.FromArgb(255, backColor);
                            }
                            paintingNumericUpDown.BackColor = backColor;
                        }
                        // Finally paint the NumericUpDown control
                        Rectangle srcRect = new Rectangle(0, 0, valBounds.Width, valBounds.Height);
                        if (srcRect.Width > 0 && srcRect.Height > 0)
                        {
                            paintingNumericUpDown.DrawToBitmap(renderingBitmap, srcRect);
                            graphics.DrawImage(renderingBitmap, new Rectangle(valBounds.Location, valBounds.Size),
                                               srcRect, GraphicsUnit.Pixel);
                        }
                    }
                    if (PartPainted(paintParts, DataGridViewPaintParts.ErrorIcon))
                    {
                        // Paint the potential error icon on top of the NumericUpDown control
                        base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText,
                                   cellStyle, advancedBorderStyle, DataGridViewPaintParts.ErrorIcon);
                    }
                }
            }
            catch 
            {
                throw;
            }
        }

この問題の解決策はありますか?

4

3 に答える 3

1

これは、フォームを破棄している間 (つまり、フォームを閉じている間) にこれらのイベントがまだ発生しているために発生しているため、次の行が必要なだけです。

if (paintingNumericUpDown.IsDisposed) { return; }

メソッドの上部にあります。自分で描いた副産物です。

于 2013-07-01T13:58:44.667 に答える
0

ここから Microsoft のコードを使用すると、同様の問題が発生しました: https://docs.microsoft.com/en-us/previous-versions/aa730881(v=vs.80)

この例のソリューションに基づいているため、コンストラクターには次のものが含まれていると思います。

        // Create a thread specific NumericUpDown control used for the painting of the non-edited cells
        if (paintingNumericUpDown == null)
        {
            paintingNumericUpDown = new NumericUpDown();
            // Some properties only need to be set once for the lifetime of the control:
            paintingNumericUpDown.BorderStyle = BorderStyle.None;
            paintingNumericUpDown.Maximum = Decimal.MaxValue / 10;
            paintingNumericUpDown.Minimum = Decimal.MinValue / 10;
        }

PaintNumericUpDown をより頻繁に再作成することで問題を修正しました。

        // Create a thread specific NumericUpDown control used for the painting of the non-edited cells
        if (paintingNumericUpDown == null || paintingNumericUpDown.IsDisposed)
        {
            paintingNumericUpDown = new NumericUpDown();
            // Some properties only need to be set once for the lifetime of the control:
            paintingNumericUpDown.BorderStyle = BorderStyle.None;
            paintingNumericUpDown.Maximum = Decimal.MaxValue / 10;
            paintingNumericUpDown.Minimum = Decimal.MinValue / 10;
        }

それがあなたにとってもうまくいくことを願っています。

于 2019-09-06T13:28:02.677 に答える