Infragistics Ultragrid 如何根据属性禁用一行?

5
我希望能够根据行中的布尔同步属性禁用Ultragrid中的某些行。我想到了两种不同的解决方案,但都没有成功。
1)将同步属性数据绑定到行的激活属性上。这是否可行?
2)在网格的InitializeRow事件等事件中查找同步属性,并在其设置为true时禁用该行。此方法有效,但如果添加了更多行并保存了网格,则数据会重新排序,因此禁用的行不包含正确的数据。因此,我需要一种知道发生这种情况的方法,以便之后可以再次禁用正确的行。
private void ultraGrid1_InitializeRow(object sender, Infragistics.Win.UltraWinGrid.InitializeRowEventArgs e)
{
    e.Row.Activation = Infragistics.Win.UltraWinGrid.Activation.AllowEdit;
    if (e.Row.Cells[grdBoundGrip.DisplayLayout.Bands[0].Columns["Sync"]].Value != null && (bool)e.Row.Cells[grdBoundGrip.DisplayLayout.Bands[0].Columns["Sync"]].Value)
            e.Row.Activation = Infragistics.Win.UltraWinGrid.Activation.Disabled;
}

2
你能在InitializeRow事件中展示一下代码吗? - Steve
嗨 Steve,我已经添加了上面的代码,它运行得很好。问题是,在单击保存之后,有一些代码会更新和更改数据项的顺序,不幸的是这不会再次触发InitializeRow事件。 - Jim
InitializeRow 的文档解释了即使更改单个单元格的值,也应该调用此事件。因此,在保存命令之后有一些东西阻止了此事件的触发。同样,保存命令后的代码可能会有所帮助。 - Steve
@Jim 如果重新排列行并不实际改变行内的任何值,则预计InitializeRow不会触发。如果你所做的只是改变集合中的顺序,并且这决定了是否可以激活行,则建议向网格绑定的列表项添加一个属性/列,用于跟踪,以便在属性更改时触发InitializeRow。 - alhalama
1
此外,在保存后调用 UltraWinGrid.Refresh,并带有 RefreshRow.FireInitializeRow 参数。 - Algirdas
1个回答

5
你也可以在自己的函数中编写它。我希望以下解决方案能帮到你。
创建一个名为“test”的窗体,并像下面展示的那样将“ultragird”拖放到该窗体中。 enter image description here 创建一个名为“test_Load”的窗体加载函数,并尝试以下代码。 同步“false”的行将被禁用。
   private void test_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("Address", typeof(string));
        dt.Columns.Add("Sync", typeof(string));
        dt.Rows.Add(new object[] {"John","United States","False" });
        dt.Rows.Add(new object[] { "Xing", "China", "True" });
        dt.Rows.Add(new object[] { "Ram", "Nepal", "True" });
        dt.Rows.Add(new object[] { "Germany", "Thomas", "False" });
        dt.Rows.Add(new object[] { "Pedrik", "Russia", "True" });

        ultraGrid1.DataSource = dt;
        ultraGrid1.DataBind();

        DisableRowsWithSyncOff(dt.Rows.Count);

    }
    private void DisableRowsWithSyncOff(int _rowcount)
    {
        for (int i = 0; i < _rowcount; i++)
        {                
            if (!Convert.ToBoolean(ultraGrid1.Rows[i].Cells["Sync"].Value.ToString()))
            {                    
                ultraGrid1.Rows[i].Activation = Infragistics.Win.UltraWinGrid.Activation.Disabled;
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接