0

私は datagridview でカスタム コントロールをホストしました。CustomControl (サード パーティ コントロール) としましょう。セルは編集モードに入ったときにのみ描画されます。編集モードを終了すると表示されないため、ペイント メソッドをオーバーライドしました (以下を参照)。Windows 7 では正常に動作していますが、Windows XP では動作しません。DrawToBitmap が失敗しています。何か案は?

        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)         {             // Call the base class method to paint the default​ cell appearance.
        base.Paint(
            graphics,
            clipBounds,
            cellBounds,
            rowIndex,
            cellState,
            value,
            formattedValue,
            errorText,
            cellStyle,
            advancedBorderStyle,
            paintParts);

        CustomControl customControl= (CustomControl)this.DataGridView.Rows[rowIndex].Cells[this.ColumnIndex].Value;

        Bitmap img = new Bitmap(cellBounds.Width, cellBounds.Height);

        // Resize propertyEditor control to cell bounds
        propertyEditor.Height = cellBounds.Hei​ght;
        propertyEditor.Width = cellBounds.Widt​h;

        // Sets the cell's backcolor according to the data​ grid view's color
        customControl.BackColor = this.DataGridView.Rows[rowIndex].Cells[this.ColumnIndex].Style.BackColor;

        // Finally paint the propertyEditor control       ​     
        customControl.DrawToBitmap(img, new Rectangle(0, 0, customControl.Width, customControl.Height​));
        graphics.DrawImage(img, cellBounds.Loc​ation);
    }
4

1 に答える 1

1

Application.EnableVisualStyles()から行を削除することで、Windows 7 で非常によく似た問題を再現できましたProgram.cs。サードパーティではなく単純な ComboBox を使用していましたが、効果は同じでした。この問題を克服するには、次の 3 つのことを行う必要がありました。

  1. (カスタム) コントロールを visible true に設定して、DrawToBitmap確実にレンダリングできるようにします。
  2. コントロールの親をDataGridView(eg customControl.Parent = DataGridView) に設定して、親も表示されるようにします。
  3. コントロールを表示領域の外に移動します (たとえばcustomControl.Location = new Point(0, -(customControl.Height))、コントロールが表示されるべきでない場所に表示されないようにします)。

これは私の場合は機能しましたが、カスタム コントロールが関数を処理する方法に依存する場合がありDrawToBitmapます。

これがあなたの場合に役立つかどうか、または誰かがよりエレガントなソリューションを見つけることができるかどうか、私は興味があります.

于 2012-10-25T17:47:23.770 に答える