DevExpress Gridview禁用&着色细胞

时间:2015-12-13 22:18:46

标签: vb.net devexpress

我正在使用DevExpress Gridview控件。

我有两个不同的问题:

我有四行数据(数据集中总是前4条记录),始终不能编辑某些单元格。这些行应该具有灰色背景的某些列,表明它们已被禁用。

现在,我唯一可以使用的是GridView2_RowCellStyle

Dim View As GridView = sender

If e.Column.FieldName = "Percent" Or e.Column.FieldName = "PGPct" Or e.Column.FieldName = "VGPct" Then
    If e.RowHandle = 0 Or e.RowHandle = 1 Or e.RowHandle = 2 Or e.RowHandle = 3 Then
        e.Appearance.BackColor = Color.Silver
    End If
End If

GridView2_ShowingEditor

If GridView2.FocusedColumn.FieldName.ToString = "Percent" Or GridView2.FocusedColumn.FieldName.ToString = "PGPct" Or GridView2.FocusedColumn.FieldName.ToString = "VGPct" Then
    If GridView2.FocusedRowHandle = 0 Then
        e.Cancel = True
    End If
End If

但是,当用户对数据进行排序或分组时,这些行可能会发生变化,这使得无法通过FocusedRowHandle或RowHandle选择它们。

如何确保这些单元格始终处于禁用状态并且背景为灰色,即使在排序或分组时也是如此?

2 个答案:

答案 0 :(得分:0)

我认为您可以采取一些措施来实现这一目标。

  1. 将属性(以及列)添加到绑定的域对象并将其命名为RowNumber
  2. 填充数据时,按顺序对RowNumber编号,以便对象本身跟踪它所在的行。更好的是,使用静态变量使其成为对象的一部分,以便自动递增
  3. 您现在可以直接使用网格设计师的格式条件,而不是使用RowCellStyle,它是一种无代码的方式来完成同样的事情
  4. 就锁定行而言,如果您使用的是绑定源,请使用CurrentChanged事件有选择地为某些行只读这些列。实际上,您将根据选择的行切换列的只读属性,这将阻止编辑某些行
  5. 我相信如果你不清楚它们中的任何一个,我相信你可以告诉我。我是一名C#家伙,但我非常确定C#上的模拟示例足够清晰,可以翻译成VB.net。

    - 编辑12/15/15 -

    在第1项上,假设您的绑定对象是域对象/ POCO /无论如何添加一个属性:

    private int _RowNum;
    public int RowNum
    {
        get { return _RowNum; }
    }
    

    只需确保在收集数据时分配值或让构造函数执行此操作:

    private static _Serial = 1;
    
    public MyDomainObject()
    {
        _RowNum = _Serial++;
    }
    

    或 - 如果你想在事后做到这一点:

    int serial = 1;
    MyDomainObjectList.Foreach(x => x.RowNum = serial++);
    

    对于第4项,我想象你有一个绑定源,如果你在绑定源上触发CurrentChanged事件:

    bindingSource1.CurrentChanged += new System.EventHandler(bindingSource1_CurrentChanged);
    

    它看起来像这样:

    private void bindingSource1_CurrentChanged(object sender, EventArgs e)
    {
        MyDomainObject curr = (MyDomainObject)bindingSource1.Current;
        bool locked = curr.RowNum >= 1 && curr.RowNum <= 4;
    
        colPercent.OptionsColumn.ReadOnly =
            colPGPct.OptionsColumn.ReadOnly = locked;
    }
    

    这与格式化没有任何关系(由我的建议#3处理),但它会根据选择的行选择性地锁定或解锁列。由于用户无法编辑他不在的行,因此可以实现使某些行无法编辑的目标。

    我为C#道歉。我知道你问了一个VB问题,但我觉得你读C#比我猜测VB语法更容易。

    看看这是否有任何意义,或者我是否可以进一步澄清。这有点难以推测,所以我理解它是否是一个失败的原因。

答案 1 :(得分:0)

您可以使用GridView.GetDataSourceRowIndex方法获取基础数据源的实际索引。此索引不依赖于GridView中的排序,分组,过滤等,并且始终为同一行返回相同的值。
例如:

Private Sub gridView2_RowCellStyle(ByVal sender As Object, ByVal e As RowCellStyleEventArgs) Handles gridView2.RowCellStyle
    Dim View As GridView = sender

    If e.Column.FieldName = "Percent" Or e.Column.FieldName = "PGPct" Or e.Column.FieldName = "VGPct" Then
        If View.GetDataSourceRowIndex(e.RowHandle) < 4 Then
            Dim colors = CommonSkins.GetSkin(UserLookAndFeel.Default).Colors
            Dim textColor = colors.GetColor(CommonColors.DisabledText)
            Dim backColor = colors.GetColor(CommonColors.DisabledControl)

            e.Appearance.ForeColor = textColor
            e.Appearance.BackColor = backColor
        End If
    End If
End Sub