Disabling the button column in the datagridview

后端 未结 3 1142
误落风尘
误落风尘 2020-12-03 22:02

i have a data gridview with 4 columns first 2 columns are combobox columns, third column is textbox column and 4th column is button column.In form load i have to disable the

相关标签:
3条回答
  • 2020-12-03 22:19

    This is a supplement to Jay's answer.

    By request, here is the code that I used to create a button cell that could be disabled. It includes double-buffering so that the buttons do not flicker when the user scrolls.

    /// <summary>
    /// Adapted from https://msdn.microsoft.com/en-us/library/ms171619.aspx. Double-buffering was added to remove flicker on re-paints.
    /// </summary>
    public class DataGridViewDisableButtonCell : DataGridViewButtonCell
    {
        private bool enabledValue;
    
        public bool Enabled
        {
            get { return enabledValue; }
            set
            {
                if (enabledValue == value) return;
                enabledValue = value;
                // force the cell to be re-painted
                if (DataGridView != null) DataGridView.InvalidateCell(this);
            }
        }
    
        // Override the Clone method so that the Enabled property is copied. 
        public override object Clone()
        {
            var cell = (DataGridViewDisableButtonCell) base.Clone();
            cell.Enabled = Enabled;
            return cell;
        }
    
        // By default, enable the button cell. 
        public DataGridViewDisableButtonCell()
        {
            enabledValue = true;
        }
    
        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)
        {
            // The button cell is disabled, so paint the border, background, and disabled button for the cell. 
            if (!enabledValue)
            {
                var currentContext = BufferedGraphicsManager.Current;
    
                using (var myBuffer = currentContext.Allocate(graphics, cellBounds))
                {
                    // Draw the cell background, if specified. 
                    if ((paintParts & DataGridViewPaintParts.Background) == DataGridViewPaintParts.Background)
                    {
                        using (var cellBackground = new SolidBrush(cellStyle.BackColor))
                        {
                            myBuffer.Graphics.FillRectangle(cellBackground, cellBounds);
                        }
                    }
    
                    // Draw the cell borders, if specified. 
                    if ((paintParts & DataGridViewPaintParts.Border) == DataGridViewPaintParts.Border)
                    {
                        PaintBorder(myBuffer.Graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);
                    }
    
                    // Calculate the area in which to draw the button.
                    var buttonArea = cellBounds;
                    var buttonAdjustment = BorderWidths(advancedBorderStyle);
                    buttonArea.X += buttonAdjustment.X;
                    buttonArea.Y += buttonAdjustment.Y;
                    buttonArea.Height -= buttonAdjustment.Height;
                    buttonArea.Width -= buttonAdjustment.Width;
    
                    // Draw the disabled button.                
                    ButtonRenderer.DrawButton(myBuffer.Graphics, buttonArea, PushButtonState.Disabled);
    
                    // Draw the disabled button text.  
                    var formattedValueString = FormattedValue as string;
                    if (formattedValueString != null)
                    {
                        TextRenderer.DrawText(myBuffer.Graphics, formattedValueString, DataGridView.Font, buttonArea, SystemColors.GrayText, TextFormatFlags.PreserveGraphicsTranslateTransform | TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
                    }
    
                    myBuffer.Render();
                }
            }
            else
            {
                // The button cell is enabled, so let the base class handle the painting. 
                base.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-03 22:25

    Here's some help with the problem of setting the Enabled property of the Buttons that appear in a DataGridViewButtonColumn.

    You'll need to extend DataGridViewButtonColumn to create your own DataGridView column with disable-able buttons. This article on MSDN details how to do this.

    The article has a lot of code, and I encourage you to take a close look, but all you really need to do is copy and paste into your project the following classes found in the article:
    -- DataGridViewDisableButtonColumn
    -- DataGridViewDisableButtonCell

    Once you do this you will be able to add DataGridViewDisableButtonColumns to your DataGridView. Use the public Enabled property exposed in your custom column to set the Enabled property of each cell's Button control. Since you want to set the Enabled property of all the Buttons in the column you can write a helper method that loops through all rows in your DataGridView and sets the Enabled property:

    private void SetDGVButtonColumnEnable(bool enabled) {
        foreach (DataGridViewRow row in dataGridView1.Rows) {
            // Set Enabled property of the fourth column in the DGV.
            ((DataGridViewDisableButtonCell)row.Cells[3]).Enabled = enabled;
        }
        dataGridView1.Refresh();
    }
    
    0 讨论(0)
  • 2020-12-03 22:25

    You can use this MSDN article MSDN article:Disable button in dataGridView it uses a class for datagridview button and notice that you have to check enable status of button whenever you willing to handle it

    0 讨论(0)
提交回复
热议问题