C# 检测是否在InitializeRow事件中选择了行

C# 检测是否在InitializeRow事件中选择了行,c#,infragistics,C#,Infragistics,我有一个ultrawingrid里面装满了联系人-其中一些联系人需要根据联系人的属性以不同的颜色显示 我有一个initializerow事件,带有以下简单代码: private void grdPeople_InitializeRow(object sender, InitializeRowEventArgs e) { if (e.Row.Cells["NoSMS"].Value != null) { if (e.Row.C

我有一个
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
标志设置为true,则上面的代码将灰显联系人-这意味着他们不希望被联系。尊重隐私等

现在,当选中该行时,该颜色将被
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);
                    }
                }

有人知道我如何检测当前正在初始化的行当前是否在选择中,或者为什么该代码可能不起作用吗?

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

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

然后可以将
初始值设定项ow
中的代码更改为

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帮助页面上的(但这只适用于每个单元格的AFAIK)

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

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

然后可以将
初始值设定项ow
中的代码更改为

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帮助页面上的(但这仅适用于每个单元格的AFAIK)

initializeRow
功能中,没有对
e.Layout.Appearances的定义:(是的,在没有检查的情况下键入太快,但是可以直接从grid.DisplayLayout属性检索外观集合。回答更新感谢steve的帮助。在这种情况下,
r
是什么?我想这是今天停止的一个好信号。修复了
initializeRow
函数中没有定义的问题
e.Layout.appearancess
:对,未经检查键入太快,但是可以直接从grid.DisplayLayout属性检索外观集合。回答更新感谢steve的帮助。在这种情况下,
r
是什么?我想这是今天停止的好信号。修复