【问题标题】:How to retain column readonly state; if datagridview readonly state changes in c#如何保留列只读状态;如果 c# 中的 datagridview 只读状态发生变化
【发布时间】:2015-05-07 06:26:18
【问题描述】:

我正在开发一个 Windows 窗体应用程序,其中我使用了一个 datagridview。它有一些列,其中 ReadOnly 为 true,而某些列 ReadOnly 为 false。

在某个时候,我必须阻止用户编辑 datagridview,但仍然查看所有行,所以我将 datagridview 的 ReadOnly 属性设置为 true。

并且当datagridview的只读状态设置回false时,所有列的ReadOnly属性也设置为false。

我无法禁用 datagridview,因为在禁用状态下,用户无法查看所有行。

提前致谢。

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    我最初的想法是让您为每个DataGridView 创建一个ReadOnly 列的列表。然后您是否从该列表中重置这些列,或者在每个DataGridViewReadOnlyChanged 事件中(代码副本过多),或者将这些列表作为第二个参数发送到 common code 方法和在那里重置它们。但后来我想,如果你只能访问公共代码会怎样

    这使我想到了以下通用解决方案。这个想法保持不变:每个DataGridView 将有一个ReadOnly 列的列表。但是这个列表将通过Tag 属性直接附加到DataGridView,而不是作为dgv(可能无法访问)父类中的代码膨胀。

    如果你的通用代码方法看起来像这样:

    public void DoStuff(DataGridView dgv)
    {
        if (dgv.ReadOnly)
        {
            dgv.ReadOnly = false;
            // Do related stuff.
        }
        else
        {
            dgv.ReadOnly = true;
            // Do other related stuff.
        }
    
        // Do common stuff.
    }
    

    保存/加载ReadOnly 列进行这些更改:

    public void DoStuff(DataGridView dgv)
    {
        if (dgv.ReadOnly)
        {
            dgv.ReadOnly = false;
    
            // Load the saved ReadOnly columns.
            List<DataGridViewColumn> rocs = dgv.Tag as List<DataGridViewColumn>;
    
            if (rocs != null)
            {
                foreach (DataGridViewColumn roc in rocs)
                {
                    roc.ReadOnly = true;
                }
            }
    
            // Do related stuff.
        }
        else
        {
            // Save the ReadOnly columns before the DGV ReadOnly changes.
            List<DataGridViewColumn> rocs = new List<DataGridViewColumn>();
    
            foreach (DataGridViewColumn col in dgv.Columns)
            {
                if (col.ReadOnly)
                {
                    rocs.Add(col);
                }
            }
    
            dgv.Tag = rocs;
            dgv.ReadOnly = true;
    
            // Do other related stuff.
        }
    
        // Do common stuff.
    }
    

    【讨论】:

      【解决方案2】:

      您无法通过设置DataGridView.ReadOnly 来恢复Column.ReadOnly 状态

      您可以先将 ReadOnly 列保存到 List 中并使用循环

      foreach(var column in dgv.Columns.Cast<DataGridViewColumn>().Where(i => !ReadOnlyColumnList.Contains(i)))
      {
          column.ReadOnly = false;
      }
      

      【讨论】:

      • 我正在更改通用代码中的只读状态;并传递多个datagridview。
      • @PravinChopade 通用代码和多个DataGridView控件是否包含在同一个类中?如果不是,那么DataGridView 控件是否都来自同一类?如果是,我假设你的公共类有一个类似于public void DoStuff(list of DataGridViews) { set each DataGridView.ReadOnly to true; // do stuff } 的伪调用。如果不是,我假设这个调用 public void DoStuff(a single DataGridView) { set the DataGridView.ReadOnly to true; // do stuff } 是从每个 DGV 的每个类调用的。你能澄清一下吗?
      • 第二个,传递单个datagridview。
      【解决方案3】:

      我使用了CellBeginEdit 事件,并检查该列是否是我的任何只读列,然后取消该事件。

      private void dataGridView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
      {
        //ReadOnly off/on enables this again - force non-editable
        if (e.ColumnIndex == 1 || e.ColumnIndex == 5) e.Cancel = true;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-06
        • 1970-01-01
        • 2022-11-13
        • 2022-11-22
        • 2014-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多