【问题标题】:Disable edits on datagridview but still allow for highlighting to copy and paste cells禁用对 datagridview 的编辑,但仍允许突出显示以复制和粘贴单元格
【发布时间】:2014-01-18 14:21:41
【问题描述】:

是否有一个属性(或解决方法)允许但不允许在 datagridview 中进行编辑,但也允许突出显示单元格中的文本?

目前用户可以在单元格中突出显示/复制和编辑文本(但不会进行任何更改)。他们尝试编辑单元格中的文本,然后在未保存更改时感到困惑。我想要它,所以单元格看起来不可编辑。

我尝试设置只读属性 = true,但这会禁用单元格上的文本突出显示。我希望他们能够从单元格中复制。是否有像 readonly = true 这样的属性仍然允许突出显示单元格?


编辑-澄清:

文本框具有我正在寻找的效果:我有一个文本框字段,其初始文本为 readonly = true。我可以使用鼠标突出显示该文本框中的部分文本(然后复制它)。文本框的内容不可编辑。这是我想要的效果,但是我想用fullrowselectmode的datagridview来做这个。

目前我有: selectionMode = fullRowSelect(我希望能够选择整行,而不是按单元格)

只读 = 假

EditMode = EditOnKeystrokeOrF2

这些设置允许用户“双击”一个单元格,然后突出显示任何单元格中的文本。这是我想要的效果,但这些设置的唯一问题是用户还可以在该单元格中键入更多/删除文本。

谢谢!

【问题讨论】:

  • 您找到解决问题的方法了吗?我正在寻找类似的东西。

标签: .net vb.net winforms datagridview


【解决方案1】:

这样解决

Private Sub dgv_CellValidating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles dgv.CellValidating
    If dgv.IsCurrentCellDirty Then
        e.Cancel = True
        SendKeys.Send("{ESC}")
    End If
End Sub

【讨论】:

    【解决方案2】:

    您可以将选择模式设置为RowHeaderSelect。它允许您按单元格或按行复制。

    【讨论】:

      【解决方案3】:

      这是我正在使用的东西:

      • 首先将所有列设为ReadOnly=false,因为您必须覆盖其默认行为。

      • 在列上的Tag 属性中设置true 或false 是否为只读。

      • 将您的网格编辑设置设置为EditOnEnter

      • 然后,使用EditingControlShowing 事件更改每次用户单击单元格时弹出的文本框属性。无论文本框是否为只读,用户都可以选择和复制内容。


      private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) {
          if(!(e.Control is TextBox))
              return;
      
          var txt = e.Control as TextBox;
      
          if(true.Equal(grid.CurrentCell.OwningColumn.Tag)) {
              txt.ReadOnly = true;
          }
          else {
              txt.ReadOnly = false;
          }
      }
      

      Tag 不是最干净的,但还有很多其他方法可以存储一些自定义列属性。

      【讨论】:

        【解决方案4】:

        你可以使用:

        DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically
        

        这允许用户选择和复制单元格,但不能编辑它,但您的要求有点令人困惑 - 如果您想要复制单个单元格,您需要将 selesctionmode 设置为 cellselect 否则您将正在复制一整行

        【讨论】:

        • 嗯..这似乎不起作用,不过我会进一步研究。我在最初的帖子中添加了一个说明,并举例说明了我想要它做什么。现在我可以复制单个单元格(而不是整行),即使通过双击单元格来使用 fullRowSelect,但我的设置也允许用户输入我不想要的文本。
        【解决方案5】:

        您应该将 DataGridView 的 readonly 属性设置为 true,这样它将无法编辑,而用户可以复制单元格。

        【讨论】:

        • 对不起,我的意思是我将它设置为 readonly property = true (编辑了原始帖子)。一旦 readonly 属性 = true,单元格的副本就可以工作,但是用户无法用鼠标突出显示单元格中文本的特定部分。我还设置了 selectionMode = FullRowSelect 因此,一旦选择复制,最终会将整行与特定文本复制到一个单元格中,这将是很好的突出显示。不过感谢您的建议!
        猜你喜欢
        • 2013-02-16
        • 2023-03-12
        • 1970-01-01
        • 2021-02-17
        • 2010-12-17
        • 1970-01-01
        • 2017-07-15
        • 2018-01-19
        • 1970-01-01
        相关资源
        最近更新 更多