我正在开发一个Windows窗体应用程序,我正在使用datagridview。它有一些列,其中ReadOnly为true,有些列为ReadOnly为false。
在某一点上,我必须阻止用户编辑datagridview,但仍然查看所有行,所以我将datagridview的ReadOnly属性设置为true。
当datagridview的readonly状态设置为false时,所有列的ReadOnly属性也设置为false。
我无法禁用datagridview,因为在禁用状态下,用户无法查看所有行。
提前致谢。
答案 0 :(得分:1)
我最初的想法是让您为每个ReadOnly
创建DataGridView
列的列表。然后,您可以在ReadOnlyChanged
事件中重置该列表中的每个DataGridView
(代码副本太多),或将这些列表作为第二个参数发送到公共代码方法并在那里重置它们。但后来我想,如果你只能访问公共代码那会怎么样?
这使我得到以下通用解决方案。这个想法保持不变:每个DataGridView
都会有一个ReadOnly
列的列表。但是这个列表将通过DataGridView
属性直接附加到Tag
,而不是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.
}
答案 1 :(得分:0)
您只需设置Column.ReadOnly
DataGridView.ReadOnly
州
您可以先将ReadOnly列保存到List中,然后使用循环
foreach(var column in dgv.Columns.Cast<DataGridViewColumn>().Where(i => !ReadOnlyColumnList.Contains(i)))
{
column.ReadOnly = false;
}
答案 2 :(得分:0)
我使用了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;
}