You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何设置DevExpress TreeList与CheckedListBoxControl仅点击复选框才勾选?

修改DevExpress控件复选框点击行为的解决方案(v18.1)

当然可以修改这些默认交互行为!针对你提到的两个控件,我分别给出适配v18.1版本的实现方案:

一、TreeList:点击标题(文本区域)不触发复选框勾选

TreeList默认会在点击行任意区域(包括文本)时切换复选框状态,要实现仅点击复选框本身才触发勾选,可以用以下两种方法:

方法1:通过MouseDown事件判断点击区域

在TreeList的MouseDown事件里,检查点击位置是否属于复选框的按钮区域,若不是则拦截后续勾选逻辑:

private void treeList1_MouseDown(object sender, MouseEventArgs e)
{
    TreeList treeList = sender as TreeList;
    TreeListHitInfo hitInfo = treeList.CalcHitInfo(e.Location);
    
    // 确认点击的是带复选框的列
    if (hitInfo.Column != null && hitInfo.Column.ColumnEdit is RepositoryItemCheckEdit)
    {
        // 仅当点击复选框按钮时允许触发勾选,否则阻止事件
        if (!hitInfo.HitInfoType.HasFlag(TreeListHitInfoType.CheckBox))
        {
            DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
        }
    }
}

方法2:自定义复选框编辑项(更彻底)

如果方法1在某些场景下有遗漏,可以自定义RepositoryItemCheckEdit,限制只有点击复选框实际区域才触发勾选:

public class CustomRepositoryItemCheckEdit : RepositoryItemCheckEdit
{
    public override bool IsClickOnCheckBox(Point hitPoint, DevExpress.XtraEditors.ViewInfo.CheckEditViewInfo viewInfo)
    {
        // 仅当点击复选框的按钮矩形区域时返回true
        return viewInfo.CheckBoxRect.Contains(hitPoint);
    }
}

之后把TreeList复选框列的编辑项替换成这个自定义类:

CustomRepositoryItemCheckEdit customCheckEdit = new CustomRepositoryItemCheckEdit();
treeList1.Columns["你的复选框列名"].ColumnEdit = customCheckEdit;

二、CheckedListBoxControl:调整默认点击文本勾选的行为(可选)

你提到当前CheckedListBoxControl点击文本会自动勾选,如果之后想要修改这个逻辑(比如仅点击复选框才勾选),同样可以通过事件控制:

private void checkedListBoxControl1_MouseDown(object sender, MouseEventArgs e)
{
    CheckedListBoxControl checkList = sender as CheckedListBoxControl;
    int itemIndex = checkList.IndexFromPoint(e.Location);
    
    if (itemIndex >= 0)
    {
        CheckedListBoxViewInfo viewInfo = checkList.GetViewInfo() as CheckedListBoxViewInfo;
        CheckedListBoxItemInfo itemInfo = viewInfo.Items[itemIndex];
        
        // 点击的不是复选框区域时,阻止勾选逻辑
        if (!itemInfo.CheckBounds.Contains(e.Location))
        {
            DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
        }
    }
}

内容的提问来源于stack exchange,提问作者Devendra Pandey

火山引擎 最新活动