c# - Devexpress GridView 条件单元格格式

标签 c# winforms gridview devexpress appearance

有一个带有要购买的商品的 gridView。

Group
 - Checkbox|Item Description

每个组可以购买的元素数量上限。

当达到最大值(每组)时,我想更改所有未选定行的外观。

示例:

Select 1 item from each group

第 1 组

  • [ ] 项目 1
  • [ ] 项目 2

第 2 组

  • [ ] 第 3 项
  • []第 4 项
  • []第 5 项

选择后

第 1 组

  • [x] 项目 1
  • [ ] 项目 2

第 2 组

  • [ ] 第 3 项
  • [x]第 4 项
  • []第 5 项

检查每组中的最大项目数量后,我想更改其余项目的外观。

我有第一列的小组摘要。我的问题是我不知道如何触发所有单元格的外观变化。在每个单元格离开事件上计算所选项目是否正确,或者是否有更好的方法来实现此目的?

最佳答案

我使用 GridControl 创建了 Devexpress 模板。 Person 类是为我创建的。 我对此示例进行了一些更改。

public class Person {

    public Person(string firstName, string secondName) {
        this.FirstName = firstName;
        this.SecondName = secondName;
        this.Comments = String.Empty;
    }
    public Person(string firstName, string secondName, string comments)
        : this(firstName, secondName) {
            this.Comments = comments;
    }

    public bool Selected
    {
        get;
        set;
    }

    public bool Blocked
    {
        get;
        set;
    }

    public string FirstName
    {
        get;
        set;
    }
    public string SecondName
    {
        get;
        set;
    }
    public string Comments
    {
        get;
        set;
    }
}

我的网格如下所示:

My grid looks like this

我用代码实现了您的功能:

public partial class Form1 : XtraForm
{
    int max = 2;

    public Form1()
    {
        InitializeComponent();
        InitGrid();

    }
    List<Person> gridDataList = new List<Person>();
    void InitGrid()
    {
        gridDataList.Add(new Person("John", "Smith"));
        gridDataList.Add(new Person("Gabriel", "Smith"));
        gridDataList.Add(new Person("Ashley", "Smith", "some comment"));
        gridDataList.Add(new Person("Adrian", "Smith", "some comment"));
        gridDataList.Add(new Person("Gabriella", "Smith", "some comment"));
        gridDataList.Add(new Person("John", "Forester"));
        gridDataList.Add(new Person("Gabriel", "Forester"));
        gridDataList.Add(new Person("Ashley", "Forester", "some comment"));
        gridDataList.Add(new Person("Adrian", "Forester", "some comment"));
        gridDataList.Add(new Person("Gabriella", "Forester", "some comment"));
        bindingSource1.DataSource = gridDataList;
    }

    private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
    {
        int parentHandle = gridView1.GetParentRowHandle(e.RowHandle);
        int count = gridView1.GetChildRowCount(parentHandle);
        int childHandle = -1;
        int nCount = 0;
        for (int i = 0; i < count; i++)
        {
            childHandle = gridView1.GetChildRowHandle(parentHandle, i);
            Person p = gridView1.GetRow(childHandle) as Person;
            if (p != null)
            {
                p.Blocked = false;
                if (p.Selected)
                {
                    nCount++;
                }
            }
        }
        if (nCount == max)
        {
            for (int i = 0; i < count; i++)
            {
                childHandle = gridView1.GetChildRowHandle(parentHandle, i);
                Person p = gridView1.GetRow(childHandle) as Person;
                if (p != null && !p.Selected)
                {
                    p.Blocked = true;
                }
            }
        }
        // to redraw grid
        gridView1.RefreshData();
    }

    private void richedSelected_EditValueChanged(object sender, EventArgs e)
    {
        gridView1.PostEditor();
    }

    private void gridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
    {
        Person p = gridView1.GetRow(e.RowHandle) as Person;
        if (p != null && p.Blocked)
        {
            e.Appearance.ForeColor = Color.White;
        }
    }

    private void richedSelected_EditValueChanging(object sender, DevExpress.XtraEditors.Controls.ChangingEventArgs e)
    {
        Person p = gridView1.GetRow(gridView1.FocusedRowHandle) as Person;
        if (p != null && p.Blocked)
        {
            e.Cancel = true;
        }
    }

}

这当然是简化的实现。只是为了让您走上正轨。

设计师的元素:

    private DevExpress.XtraGrid.GridControl gridControl;
    private DevExpress.XtraGrid.Views.Grid.GridView gridView1;
    private System.Windows.Forms.BindingSource bindingSource1;
    private DevExpress.XtraGrid.Columns.GridColumn colFirstName;
    private DevExpress.XtraGrid.Columns.GridColumn colSecondName;
    private DevExpress.XtraGrid.Columns.GridColumn colComments;
    private DevExpress.XtraGrid.Columns.GridColumn colSelected;
    private DevExpress.XtraEditors.Repository.RepositoryItemCheckEdit richedSelected;

如果您找到更好的解决方案,请告诉我。

关于c# - Devexpress GridView 条件单元格格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10587522/

相关文章:

c# - WCF 调用结果

c# - 适用于 WinRT 的 AppBarButtonSyle

.net - 哪些编程实践会影响窗口句柄的数量?

javascript - 如何禁用 GridView 中的 LinkBut​​ton

c# - 如何使用 asp.net C# 从 GridView 中的 TemplateField 获取值?

c# - LibSVM 将我所有的训练向量都变成了支持向量,为什么?

c# - C# 中的路径字符串连接问题

c# - 自动更新 C# Windows 窗体应用程序

c# - 如何将格式为 "dd/MM/yyyy"的日期字符串转换为操作系统当前文化日期格式

javascript - 单击时更改行颜色 - ASP.NET 和 JavaScript