C# 禁用数据网格视图中的按钮列
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12525305/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Disabling the button column in the datagridview
提问by sree
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 entire button column of datagrid and after this i should select first three columns and save these first three columns in database after saving this the button column in the particular row should enable.first three columns should be saved in databese by clicking a button. Please help me im struck up with this problem from many days here is the code which i used
我有一个 4 列的数据网格视图,前 2 列是组合框列,第三列是文本框列,第四列是按钮列。在表单加载中,我必须禁用数据网格的整个按钮列,然后我应该选择前三列和保存后将前三列保存在数据库中,特定行中的按钮列应启用。前三列应通过单击按钮保存在数据库中。请帮我解决这个问题很多天这里是我使用的代码
private void SATAddTemplate_Load(object sender, EventArgs e)
{
foreach (DataGridViewRow row in datagrdADDTEMP.Rows)
{
DataGridViewButtonCell btn = (DataGridViewButtonCell)row.Cells[3];
btn.ReadOnly = true;
}
}
private void btnSaveSettings_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in datagrdADDTEMP.Rows)
{
DataGridViewButtonCell btn = (DataGridViewButtonCell)row.Cells[3];
btn.ReadOnly = false;
}
}
采纳答案by Jay Riggs
Here's some help with the problem of setting the Enabledproperty of the Buttons that appear in a DataGridViewButtonColumn.
这里有一些帮助设置Enabled出现在DataGridViewButtonColumn.
You'll need to extend DataGridViewButtonColumnto create your own DataGridView column with disable-able buttons. This article on MSDNdetails how to do this.
您需要扩展DataGridViewButtonColumn以创建您自己的带有禁用按钮的 DataGridView 列。 MSDN 上的这篇文章详细介绍了如何执行此操作。
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
这篇文章有很多代码,我鼓励你仔细看看,但你真正需要做的就是将文章中的以下类复制并粘贴到你的项目中:
-- DataGridViewDisableButtonColumn
-- DataGridViewDisableButtonCell
Once you do this you will be able to add DataGridViewDisableButtonColumns to your DataGridView. Use the public Enabledproperty exposed in your custom column to set the Enabledproperty of each cell's Button control. Since you want to set the Enabledproperty of all the Buttons in the column you can write a helper method that loops through all rows in your DataGridView and sets the Enabledproperty:
完成此操作后,您将能够将DataGridViewDisableButtonColumns添加到您的 DataGridView。使用Enabled自定义列中公开的公共属性来设置Enabled每个单元格的 Button 控件的属性。由于您想设置Enabled列中所有按钮的属性,您可以编写一个辅助方法,循环遍历 DataGridView 中的所有行并设置Enabled属性:
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();
}
回答by Hamid
You can use this MSDN article MSDN article:Disable button in dataGridViewit uses a class for datagridview button and notice that you have to check enable status of button whenever you willing to handle it
您可以使用这篇 MSDN 文章MSDN 文章:在 dataGridView 中禁用按钮它使用一个类用于 datagridview 按钮并注意,只要您愿意处理它,就必须检查按钮的启用状态
回答by Chris Staley
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);
}
}
}

