如何使单元格仅在填充后才能读取?数据网格视图 C#

Posted

技术标签:

【中文标题】如何使单元格仅在填充后才能读取?数据网格视图 C#【英文标题】:How can I make a cell to read only when it has been filled? DataGridView C# 【发布时间】:2021-12-03 16:35:41 【问题描述】:

我希望在 DataGridView 上显示一个包含多列的表格,所有列都只读但只有一个。 这一列需要有用户填充的容量,但我想让已经有内容的单元格只读,而不是所有的列,这样用户仍然有填充列上剩余单元格的容量(已经填写的除外)

有没有办法做到这一点?

【问题讨论】:

查看ReadOnly 属性 查看CellBeginEdit 事件。编辑单元格时会触发该事件,因此您可以根据自己的条件在其中设置 ReadOnly 属性。 同意The2Step,但可能更简单;如果您不希望用户编辑单元格,请取消 BeginEdit 事件。您还可以查看 EditingControlShowing,如果它不是正确的单元格,则将编辑文本框设为只读 【参考方案1】:

你可以像这样设置CellEndEdit事件:

private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)

    DataGridViewCell cell =        this.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex);
    cell.ReadOnly = true;

VB.NET:

Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
    Dim cell As DataGridViewCell = Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex)
    cell.ReadOnly = True
End Sub

如果你在DataGridView开头有数据,你可以像这样在加载数据后设置访问权限:

SetAccess(this.DataGridView1);

VB.NET:

Call SetAccess(Me.DataGridView1)

...在您的班级中提供此功能:

private void SetAccess(DataGridView dgw)

    for (var ir = 0; ir <= dgw.Rows.Count - 1; ir++)
    
        for (var ic = 0; ic <= dgw.Columns.Count - 1; ic++)
        
            DataGridViewCell cell = this.DataGridView1.Rows(ir).Cells(ic);
            if (!IsNothing(cell.Value) && cell.Value.ToString.Length > 0)
                cell.ReadOnly = true;
        
    

VB.NET:

Private Sub SetAccess(dgw As DataGridView)
    For ir = 0 To dgw.Rows.Count - 1
        For ic = 0 To dgw.Columns.Count - 1
            Dim cell As DataGridViewCell = Me.DataGridView1.Rows(ir).Cells(ic)
            If Not IsNothing(cell.Value) AndAlso cell.Value.ToString.Length > 0 Then
                cell.ReadOnly = True
            End If
        Next
    Next
End Sub

经过测试,一切皆有魅力。

显然你可以玩代码,即通过修改列循环的范围来排除最后一列:

For ic = 0 To dgw.Columns.Count - 2

VB.NET(相同):

For ic = 0 To dgw.Columns.Count - 2

对不起,第一次回复时错过了c#标签。

【讨论】:

这个效果很好,很喜欢这个解释,特别是因为我计划在项目的后期版本中在操作开始时将数据保存在 DGV 中!不用担心VB.NET中的解释,看看两种编程语言的异同其实很酷

以上是关于如何使单元格仅在填充后才能读取?数据网格视图 C#的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有缩放填充模式的 tableViewHeader 中为 UIImageView 使用固定高度?

为啥我的自定义单元格仅在用户移开手指时突出显示?

刷新数据网格视图的问题

excel提示不可读取内容,恢复后,某行单元格仅显示公式不计算,怎么办,求大神!

C# WPF 工具包:如何​​使数据网格中的单元格可编辑?

如何使文本框扩展以填充网格单元的剩余空间?