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

如何在C# DataGridView单元格中显示WiFi信号强度仪表?

DataGridView中WiFi信号强度展示的两种实现方案

方案一:集成Ron Beyer的Signal Strength Control控件

如果想直接复用现有控件,只需自定义DataGridView单元格和列,通过DrawToBitmap将控件绘制到单元格中(适合只读展示场景):

1. 自定义SignalStrength单元格

public class SignalStrengthCell : DataGridViewCell
{
    private readonly SignalStrengthControl _signalControl = new SignalStrengthControl();

    protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
    {
        // 绘制单元格基础样式
        base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);

        // 解析信号强度值并绘制控件
        if (value != null && int.TryParse(value.ToString(), out int strength))
        {
            _signalControl.SignalStrength = strength;
            _signalControl.Size = cellBounds.Size;
            
            using (Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height))
            {
                _signalControl.DrawToBitmap(bmp, new Rectangle(0, 0, cellBounds.Width, cellBounds.Height));
                graphics.DrawImage(bmp, cellBounds.Location);
            }
        }
    }
}

2. 自定义SignalStrength列

public class SignalStrengthColumn : DataGridViewColumn
{
    public SignalStrengthColumn() : base(new SignalStrengthCell())
    {
        Width = 80;
        HeaderText = "WiFi信号强度";
    }

    public override DataGridViewCell CellTemplate
    {
        get => base.CellTemplate;
        set
        {
            if (value != null && !value.GetType().IsAssignableFrom(typeof(SignalStrengthCell)))
            {
                throw new InvalidCastException("单元格模板必须为SignalStrengthCell类型");
            }
            base.CellTemplate = value;
        }
    }
}

3. 在窗体中使用

// 初始化DataGridView时添加自定义列
dataGridView1.Columns.Add(new SignalStrengthColumn());

// 绑定设备数据(示例)
foreach (var device in yourIoTDeviceList)
{
    // 假设device.SignalStrength是0-100的数值
    dataGridView1.Rows.Add(device.DeviceName, device.IpAddress, device.SignalStrength);
}

方案二:自绘WiFi信号强度(无需第三方控件)

如果不想依赖第三方控件,直接在单元格中绘制信号条,轻量且可控性强:

1. 自定义自绘信号单元格

public class CustomSignalCell : DataGridViewCell
{
    protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
    {
        base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);

        if (value != null && int.TryParse(value.ToString(), out int strength))
        {
            // 将0-100的强度转换为0-5级
            int signalLevel = strength switch
            {
                <= 0 => 0,
                <= 20 => 1,
                <= 40 => 2,
                <= 60 => 3,
                <= 80 => 4,
                _ => 5
            };

            // 计算信号条的布局参数
            int barWidth = 8;
            int barGap = 3;
            int startX = cellBounds.X + (cellBounds.Width - (barWidth * 5 + barGap * 4)) / 2;
            int startY = cellBounds.Y + (cellBounds.Height - 20) / 2;

            // 绘制5根信号条
            for (int i = 0; i < 5; i++)
            {
                int barHeight = 5 + (i * 3);
                bool isActive = i < signalLevel;

                // 绘制边框
                graphics.DrawRectangle(Pens.Gray, startX, startY + 20 - barHeight, barWidth, barHeight);
                // 填充激活状态的颜色
                if (isActive)
                {
                    graphics.FillRectangle(Brushes.Green, startX + 1, startY + 21 - barHeight, barWidth - 1, barHeight - 1);
                }
                startX += barWidth + barGap;
            }
        }
    }
}

2. 自定义自绘信号列

public class CustomSignalColumn : DataGridViewColumn
{
    public CustomSignalColumn() : base(new CustomSignalCell())
    {
        Width = 80;
        HeaderText = "WiFi信号强度";
    }

    public override DataGridViewCell CellTemplate
    {
        get => base.CellTemplate;
        set
        {
            if (value != null && !value.GetType().IsAssignableFrom(typeof(CustomSignalCell)))
            {
                throw new InvalidCastException("单元格模板必须为CustomSignalCell类型");
            }
            base.CellTemplate = value;
        }
    }
}

3. 使用方式

和方案一完全一致,添加列后绑定信号强度数值即可。


补充说明

  • 如果需要动态更新信号强度,调用dataGridView1.InvalidateCell(columnIndex, rowIndex)刷新对应单元格即可;
  • 两种方案都支持数据绑定,只需确保数据源中对应字段为整数类型(0-100)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:13:17