如何禁用在DataGridView中选择的功能?

时间:2012-07-04 13:32:51

标签: c# .net winforms datagridview

我想仅使用我的DataGridView来展示内容,我希望用户无法从DataGridView中选择任何行,字段或任何内容。

我该怎么做?

10 个答案:

答案 0 :(得分:110)

我跟这个:

private void myDataGridView_SelectionChanged(Object sender, EventArgs e)
{
    dgvSomeDataGridView.ClearSelection();  
}

我不同意广泛的断言,即DataGridView不应该是不可选择的。有些UI是为工具或触摸屏而构建的,允许选择误导用户认为选择实际上会将它们带到某个地方。

在控件上设置ReadOnly = true对是否可以选择单元格或行没有影响。设置Enabled = false时会有视觉和功能上的缺点。

另一种选择是将控件选择的颜色设置为与未选择的颜色完全相同的颜色,但如果您正好操纵单元格的背面颜色,那么此方法也会产生一些令人讨厌的结果。

答案 1 :(得分:14)

您可以为所选单元格设置透明背景颜色,如下所示:

DataGridView.RowsDefaultCellStyle.SelectionBackColor = System.Drawing.Color.Transparent;

答案 2 :(得分:8)

Enabled属性false

this.dataGridView1.DefaultCellStyle.SelectionBackColor = this.dataGridView1.DefaultCellStyle.BackColor;
this.dataGridView1.DefaultCellStyle.SelectionForeColor = this.dataGridView1.DefaultCellStyle.ForeColor;

答案 3 :(得分:2)

我通过将Enabled属性设置为false来解决此问题。

答案 4 :(得分:2)

如果您不需要使用所选单元格中的信息,则清除选择有效,但如果您仍需要使用所选单元格中的信息,您可以执行此操作以使其看起来没有选择和背景颜色仍将可见。

private void dataGridView_SelectionChanged(object sender, EventArgs e)
    {
        foreach (DataGridViewRow row in dataGridView.SelectedRows)
        {
            dataGridView.RowsDefaultCellStyle.SelectionBackColor = row.DefaultCellStyle.BackColor;
        }
    }

答案 5 :(得分:1)

我发现将所有AllowUser...属性设置为falseReadOnly设置为trueRowHeadersVisible设置为falseScollBarsNone,然后faking the prevention of selection最适合我。未将Enabled设置为false仍允许用户从网格中复制数据。

以下代码还可以在需要简单的显示网格时清除外观(假设行的高度相同):

int width = 0;
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    width += dataGridView1.Columns[i].Width;
}

dataGridView1.Width = width;
dataGridView1.Height = dataGridView1.Rows[0].Height*(dataGridView1.Rows.Count+1);

答案 6 :(得分:1)

这对我来说就像一个魅力:

row.DataGridView.Enabled = false;

row.DefaultCellStyle.BackColor = Color.LightGray;

row.DefaultCellStyle.ForeColor = Color.DarkGray;

(其中row = DataGridView.NewRow(适当的重载);)

答案 7 :(得分:0)

从理论上讲,我最喜欢user4101525的答案,但实际上不起作用。 选择不是叠加层,因此您可以看到控件下的任何内容

Ramgy Borja的答案没有涉及默认样式实际上根本不是颜色的事实,因此应用它没有帮助。 这会处理默认样式,并且在应用您自己的颜色时可能会起作用(这可能是edhubbell所说的令人讨厌的结果)

dgv.RowsDefaultCellStyle.SelectionBackColor = dgv.RowsDefaultCellStyle.BackColor.IsEmpty ? System.Drawing.Color.White : dgv.RowsDefaultCellStyle.BackColor;
dgv.RowsDefaultCellStyle.SelectionForeColor = dgv.RowsDefaultCellStyle.ForeColor.IsEmpty ? System.Drawing.Color.Black : dgv.RowsDefaultCellStyle.ForeColor;

答案 8 :(得分:0)

您必须创建一个自定义DataGridView

`

namespace System.Windows.Forms
{
    class MyDataGridView : DataGridView
    {
        public bool PreventUserClick = false;

        public MyDataGridView()
        {

        }
        protected override void OnMouseDown(MouseEventArgs e)
        {
            if (PreventUserClick) return;

            base.OnMouseDown(e);
        }
    }
}

` 请注意,在使用新控件之前,必须先使用添加的类对程序进行一次编译。

然后转到.Designer.cs并将旧的DataGridView更改为新的,而不必弄乱您以前的代码。

private System.Windows.Forms.DataGridView dgv; // found close to the bottom

...

private void InitializeComponent() {
    ...
    this.dgv = new System.Windows.Forms.DataGridView();
    ...
}

至(分别)

private System.Windows.Forms.MyDataGridView dgv;

this.dgv = new System.Windows.Forms.MyDataGridView();

答案 9 :(得分:-1)

使用DataGridView.ReadOnly property

MSDN example中的代码说明了在DataGridView控件主要用于显示的情况下使用此属性。在此示例中,控件的可视外观以多种方式自定义,控件配置为有限的交互性

在示例代码中观察这些设置:

// Set property values appropriate for read-only
// display and limited interactivity
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.AllowUserToOrderColumns = true;
dataGridView1.ReadOnly = true;
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect = false;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
dataGridView1.AllowUserToResizeColumns = false;
dataGridView1.ColumnHeadersHeightSizeMode = 
DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
dataGridView1.AllowUserToResizeRows = false;
dataGridView1.RowHeadersWidthSizeMode = 
DataGridViewRowHeadersWidthSizeMode.DisableResizing;