Laden...

Wie kann ich in einer DataGridViewImageCell einen Button anzeigen lassen?

Erstellt von CarolaA vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.676 Views
Thema geschlossen
C
CarolaA Themenstarter:in
11 Beiträge seit 2012
vor 12 Jahren
Wie kann ich in einer DataGridViewImageCell einen Button anzeigen lassen?

Also mein Problem ist, dass ich in einer DataGridViewImageCell einen Button anzeigen lassen möchte. Unten seht ihr den Code für eine Zelle, wo Text und Image angezeigt werden können. Ich habe diesen Code versucht umzuschreiben, nur wenn ich dann den Button zeichnen möchte, funktioniert das gar nicht.

Habt ihr dazu eine Idee oder habt es ihr schon mal gemacht?


public class TextAndImageColumn:DataGridViewTextBoxColumn
    {
        private Image imageValue;
        private Size imageSize;

        public TextAndImageColumn()
        {
            this.CellTemplate = new TextAndImageCell();
        }

        public override object Clone()
        {
            TextAndImageColumn c = base.Clone() as TextAndImageColumn;
            c.imageValue = this.imageValue;
            c.imageSize = this.imageSize;
            return c;
        }

        public Image Image
        {
            get { return this.imageValue; }
            set
            {
                if (this.Image != value) {
                    this.imageValue = value;
                    this.imageSize = value.Size;

                    if (this.InheritedStyle != null) {
                        Padding inheritedPadding = this.InheritedStyle.Padding;
                        this.DefaultCellStyle.Padding = new Padding(imageSize.Width,
					 inheritedPadding.Top, inheritedPadding.Right, 
					 inheritedPadding.Bottom);
                    }
                }
            }
        }
        private TextAndImageCell TextAndImageCellTemplate
        {
            get { return this.CellTemplate as TextAndImageCell; }
        }
        internal Size ImageSize
        {
            get { return imageSize; }
        }
    }

    public class TextAndImageCell : DataGridViewTextBoxCell
    {
        private Image imageValue;
        private Size imageSize;
        
        public override object Clone()
        {
            TextAndImageCell c = base.Clone() as TextAndImageCell;
            c.imageValue= this.imageValue;
            c.imageSize = this.imageSize;
            return c;
        }

        public Image Image
        {
            get {
                if (this.OwningColumn == null || 
			this.OwningTextAndImageColumn == null) {

                    return imageValue;
                }
                else if (this.imageValue != null) {
                    return this.imageValue;
                }
                else {
                    return this.OwningTextAndImageColumn.Image;
                }
            }
            set {
                if (this.imageValue != value) {
                    this.imageValue = value;
                    this.imageSize = value.Size;

                    Padding inheritedPadding = this.InheritedStyle.Padding;
                    this.Style.Padding = new Padding(imageSize.Width, 
					inheritedPadding.Top, inheritedPadding.Right, 
					inheritedPadding.Bottom);
                }
            }
        }
        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)
        {
            // Paint the base content
            base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, 
			   value, formattedValue, errorText, cellStyle,
			   advancedBorderStyle, paintParts);

            if (this.Image != null) {
                // Draw the image clipped to the cell.
                System.Drawing.Drawing2D.GraphicsContainer container = 
				graphics.BeginContainer();
                
                graphics.SetClip(cellBounds);
                graphics.DrawImageUnscaled(this.Image, cellBounds.Location);

                graphics.EndContainer(container);
            }
        }

        private TextAndImageColumn OwningTextAndImageColumn
        {
            get { return this.OwningColumn as TextAndImageColumn; }
        }
    }

C
2.122 Beiträge seit 2010
vor 12 Jahren

Dazu wärs sinnvoll wenn du sagst wie du das umgeschrieben hast. So kann doch niemand sehen wo du einen Fehler gemacht hast.

Du kannst den Button nur zeichnen, aber du kannst keinen Button wirklich da hin setzen, vielleicht ist das dein Problem?

C
CarolaA Themenstarter:in
11 Beiträge seit 2012
vor 12 Jahren

public class ButtonAndImageCell : DataGridViewImageCell
        {
            private Button buttonValue;
            private Size buttonSize;

            public override object Clone()
            {
                ButtonAndImageCell c = base.Clone() as ButtonAndImageCell;
                c.buttonSize = this.buttonSize;
                c.buttonValue = this.buttonValue;
                return c;
            }

            public Button Button
            {
                get
                {
                    if (this.OwningColumn == null || this.OwningButtonAndImageColumn == null)
                    {
                        return buttonValue;
                    }
                    else if (this.buttonValue != null)
                    {
                        return this.buttonValue;
                    }
                    else
                    {
                        return this.OwningButtonAndImageColumn.Button;
                    }
                }

                set
                {
                    if (this.buttonValue != null)
                    {

                        this.buttonValue = value;
                        this.buttonSize = value.Size;

                        Padding inheritedPadding = this.InheritedStyle.Padding;
                        this.Style.Padding = new Padding(buttonSize.Width, inheritedPadding.Top, inheritedPadding.Right, inheritedPadding.Bottom);
                    }
                }
            }

            protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
            {
                //Paint the base content
                base.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);

                if (this.Button != null)
                {                    
System.Drawing.Drawing2D.GraphicsContainer container = graphics.BeginContainer();

                    System.Windows.Forms.ControlPaint.DrawButton(graphics, 10,10, buttonSize.Width, buttonSize.Height, ButtonState.Normal);
                    graphics.EndContainer(container);
                }
            }

            private ButtonAndImageColumn OwningButtonAndImageColumn
            {
                get
                {
                    return this.OwningColumn as ButtonAndImageColumn;
                }
            }
        }

        public class ButtonAndImageColumn : DataGridViewImageColumn
        {
            private Button buttonValue;
            private Size buttonSize;

            public ButtonAndImageColumn()
            {
                this.CellTemplate = new ButtonAndImageCell();
            }

            public override object Clone()
            {
                ButtonAndImageColumn c = base.Clone() as ButtonAndImageColumn;
                c.buttonValue = this.buttonValue;
                c.buttonSize = this.buttonSize;
                return c;
            }

            public Button Button
            {
                get
                {
                    return this.buttonValue;
                }
                set
                {
                    if (this.Button != value)
                    {
                        this.buttonValue = value;
                        this.buttonSize = value.Size;

                        if (this.InheritedStyle != null)
                        {
                            Padding inheritedPadding = this.InheritedStyle.Padding;
                            this.DefaultCellStyle.Padding = new Padding(buttonSize.Width, inheritedPadding.Top, inheritedPadding.Right, inheritedPadding.Bottom);
                        }
                    }
                }
            }

            private ButtonAndImageCell ButtonAndImageCellTemplate
            {
                get
                {
                    return this.CellTemplate as ButtonAndImageCell;
                }
            }       
      }

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo CarolaA,

und was ist nun anders? Oder ist es dein Ernst, dass jeder Helfer jetzt selber beide Codeabschnitte vergleichen und die Unterschiede finden soll?

Offensichtlich bist du darauf aus, uns einfach deinen Code zu posten und wir sollen dann den für dich Fehler suchen.

Nee, so bitte nicht. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 4 und 5.

herbivore

Thema geschlossen