68

我想用我的DataGridViewonly 来展示东西,我希望用户不能从DataGridView.

我怎样才能做到这一点?

4

12 回答 12

138

我会这样做:

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

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

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

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

于 2012-12-19T15:29:00.893 回答
19

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

DataGridView.RowsDefaultCellStyle.SelectionBackColor = System.Drawing.Color.Transparent;
于 2014-10-02T07:19:02.053 回答
13

Enabled财产false

或者

this.dataGridView1.DefaultCellStyle.SelectionBackColor = this.dataGridView1.DefaultCellStyle.BackColor;
this.dataGridView1.DefaultCellStyle.SelectionForeColor = this.dataGridView1.DefaultCellStyle.ForeColor;
于 2017-05-16T01:19:41.817 回答
3

我通过将Enabled属性设置为false.

于 2012-12-19T08:48:02.647 回答
3

如果您不需要使用所选单元格中的信息,则清除选择有效,但如果您仍需要使用所选单元格中的信息,您可以这样做以使其看起来没有选择,并且背景颜色仍然是可见的。

private void dataGridView_SelectionChanged(object sender, EventArgs e)
    {
        foreach (DataGridViewRow row in dataGridView.SelectedRows)
        {
            dataGridView.RowsDefaultCellStyle.SelectionBackColor = row.DefaultCellStyle.BackColor;
        }
    }
于 2021-01-15T23:39:19.250 回答
2

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

row.DataGridView.Enabled = false;

row.DefaultCellStyle.BackColor = Color.LightGray;

row.DefaultCellStyle.ForeColor = Color.DarkGray;

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

于 2016-04-12T23:55:18.513 回答
1

我发现将所有AllowUser...属性设置为falseReadOnlyto trueRowHeadersVisibleto falseScollBarsto None,然后伪造防止选择对我来说效果最好。未设置Enabledfalse仍允许用户从网格中复制数据。

当您想要一个简单的显示网格(假设行的高度相同)时,以下代码也会清理外观:

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);
于 2013-05-29T16:12:58.873 回答
0

它在 VB 中,但不应该难以转换为 C#:如果要锁定 datagridview,请使用dg.ReadOnly == True;

如果您想阻止用户选择另一行,只需记住旧选择并根据条件集或不设置应选择的行。假设关闭了多选:

    Private Sub dg_SelectionChanged(sender As Object, e As EventArgs) Handles dg.SelectionChanged
    Static OldSelection As Integer
      If dg.Rows.Count > 0 Then
          If dg.SelectedRows(0).Index <> OldSelection And YOURCONDITION Then
            dg.Rows(OldSelection).Selected = True
          End If

        OldSelection = dg.SelectedRows(0).Index
      End If
    End Sub
于 2021-09-23T13:24:19.693 回答
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

…</p>

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

到(各自)

private System.Windows.Forms.MyDataGridView dgv;

this.dgv = new System.Windows.Forms.MyDataGridView();
于 2018-09-16T19:16:38.067 回答
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;
于 2018-07-16T16:24:49.983 回答
0

在从 DataGridView 继承的类中禁用默认选择对我来说一直有效:

// REQUIRES: SelectionMode = DataGridViewSelectionMode.FullRowSelect
protected override void SetSelectedRowCore(int rowIndex, bool selected)
{       
    base.SetSelectedRowCore(rowIndex, selected && ALLOW_DEFAULT_SELECTION);
}
bool ALLOW_DEFAULT_SELECTION = false;

通常目标是完全禁用它(以实现我们自己的自定义选择和绘制过程)。当目标是仅在特定时间允许默认选择时,可以像这样包装布尔值:

public void SelectRowExplicitly(int index, bool selected = true)
{
    try
    {
        ALLOW_DEFAULT_SELECTION = true;
        Rows[index].Selected = selected;
    }
    finally
    {
        ALLOW_DEFAULT_SELECTION = false;
    }
}
于 2022-01-24T17:30:31.727 回答
-3

使用DataGridView.ReadOnly物业

MSDN 示例中的代码说明了此属性在主要用于显示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;
于 2012-07-04T15:36:18.470 回答