You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastObjectListView按钮列格式化:切换状态下的颜色与对齐设置问题

FastObjectListView按钮列的状态切换与自定义渲染

我在FastObjectListView中添加了一个按钮列,用作特定变量的状态切换器,点击按钮时需要在ON/OFF两种状态间切换(对应不同视觉样式:OFF为浅色背景、文字靠右;ON为绿色背景、文字靠左)。

切换逻辑本身并不复杂,但我完全不知道如何修改按钮列的颜色以及调整文字的水平对齐方式。

尝试过的代码

ButtonClick事件(测试颜色用)

我先写了以下ButtonClick事件,仅用于测试颜色是否生效,并未实现完整的切换逻辑,但测试没有成功:

folvOutputs.ButtonClick += delegate (object sender, CellClickEventArgs e)
{
    ioClass ioObj = e.Model as ioClass;
    bool bOn = false;
    if (ioObj.ioStatus == 1)
    {
        bOn = true;
    }
    e.Item.ForeColor = Color.Red;
    e.SubItem.ForeColor = Color.Red;
   
    sendCANMessageToSwitch((byte)ioObj.ioSourceAddress, (byte)ioObj.ioSubID, bOn);
    folvOutputs.RefreshObject(ioObj);

};

FormatCell事件

我还启用了UseCellFormatEvents,编写了对应的FormatCell事件:

private void folvOutputs_FormatCell(object sender, BrightIdeasSoftware.FormatCellEventArgs e)
{
    if (e.SubItem is null) return;
    if (e.ColumnIndex == 6)
    {
        ioClass ioObj = (ioClass)e.Model;
        if (ioObj.ioStatus == 1)
        {
            e.SubItem.ForeColor = Color.Green;
        }
        else
        {
            e.SubItem.ForeColor = Color.Red;
        }
    }
}

最终实现方案

后来我通过重写Render方法实现了需求,不确定这是不是最优方案,但目前可以正常工作:

public override void Render(Graphics g, Rectangle r)
{
    base.Render(g, r);
    StringFormat fmt = new StringFormat(StringFormatFlags.NoWrap);
    fmt.LineAlignment = StringAlignment.Center;
    fmt.Trimming = StringTrimming.EllipsisCharacter;

    SolidBrush brush;
    Pen topLeft, bottomRight;
    if (GetText() == "OFF")
    {
        fmt.Alignment = StringAlignment.Far;
        brush = new SolidBrush(Color.LightGray);
        topLeft = new Pen(Color.Black, 2);
        bottomRight = new Pen(Color.Black, 2);
    }
    else
    {
        fmt.Alignment = StringAlignment.Near;
        brush = new SolidBrush(Color.ForestGreen);
        topLeft = new Pen(Color.White, 2);
        bottomRight = new Pen(Color.Black, 2);
    }
    g.FillRectangle(brush, r);
    g.DrawRectangle(topLeft, r);
    g.DrawRectangle(bottomRight, new Rectangle(r.X + 1, r.Y + 1, r.Width - 2, r.Height - 2));
    g.DrawString(this.GetText(), this.Font, this.TextBrush, r, fmt);

    brush.Dispose();
    topLeft.Dispose(); 
    bottomRight.Dispose();
}

内容的提问来源于stack exchange,提问作者Christiaan Retief

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:25:56