在InitializeRow事件中检测行是否被选中

本文关键字:是否 检测 InitializeRow 事件 | 更新日期: 2023-09-27 18:06:11

我有一个充满联系人的ultrawingrid -其中一些需要根据该联系人的属性以不同的配色方案出现。

我有一个initializerow事件,使用以下简单代码:

    private void grdPeople_InitializeRow(object sender, InitializeRowEventArgs e)
    {
        if (e.Row.Cells["NoSMS"].Value != null)
        {
            if (e.Row.Cells["NoSMS"].Value.ToString() == "True")
            {
                e.Row.Appearance.BackColor = System.Drawing.Color.FromArgb(255, 80, 50, 30);
                e.Row.Appearance.ForeColor = System.Drawing.Color.FromArgb(255, 150, 150, 150);
            }
        }
    }

上面的代码显示,如果他们有一个NoSMS标志设置为真-这意味着他们不希望被接触。尊重隐私,等等。

现在,当这一行被选中时,这种颜色被ultrawingrid的"选定"配色方案覆盖-这意味着当用户选择一大组联系人时,它不是立即可见哪些是"变灰"。

我已经尝试添加以下代码,但它没有工作:

                foreach (UltraGridRow row in grdPeople.Selected.Rows)
                {
                    if (e.Row.Index == row.Index)
                    {
                        e.Row.Appearance.BackColor = System.Drawing.Color.FromArgb(255, 80, 50, 30);
                        e.Row.Appearance.ForeColor = System.Drawing.Color.FromArgb(255, 150, 150, 150);
                    }
                }

有没有人知道我如何检测当前行被初始化是否当前在选择中,或者为什么代码可能不工作?

在InitializeRow事件中检测行是否被选中

首先要做的是通过设计器一次性定义Appearance,并将其添加到DisplayLayout属性的Appearances集合中。
存储在那里的每个Appearance都由一个键值标识(在这个场景中我们使用"disabled_row")。

这样每行只有一个外观,而不是一个外观。
同样,以这种方式引用单元格值可能会导致大量内存消耗,inffragistics推荐的方法是使用GetCellValue方法检索值(参见WinGrid性能指南)

那么你在InitializeRow中的代码可以改为

private void grdPeople_InitializeRow(object sender, InitializeRowEventArgs e)
{
    UltraGridColumn c = e.Row.Band.Columns["NoSMS"];
    object o = e.Row.GetCellValue(c) ?? false;
    bool noSMS = Convert.ToBoolean(o);
    if (noSMS)
    {
        e.Row.Appearance = grdPeople.DisplayLayout.Appearances["disabled_row"];
        foreach(UltraGridCell c in e.Row.Cells)
            c.SelectedAppearance = grdPeople.DisplayLayout.Appearances["disabled_row"];
    }
}

检查Infragistics帮助页面上的条件格式(但这只适用于单元格)