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

C# Windows Forms项目中存储小型静态表数据的最优方案咨询

C# WinForms 替代Excel表格的实现方案

一、数据内存存储方案

因为数据来自书籍且几乎无改动,完全不需要SQL数据库,推荐两种轻量高效的方案:

  • 硬编码静态集合:数据量小时直接在代码中初始化实体类集合,查询效率最高
  • 嵌入式资源文件:数据量大时,将数据存为JSON/XML文件并设为嵌入式资源,启动时加载到内存字典中,兼顾维护性和性能

示例自定义数据实体类:

public class BookTableData
{
    // 首列作为查询主键
    public string PrimaryKey { get; set; }
    // 对应Excel的其他列,按需定义类型(字符串/数字等)
    public string SampleName { get; set; }
    public double MeasurementValue { get; set; }
    public int Count { get; set; }
}

初始化内存字典(用主键快速匹配查询):

// 全局存储字典,程序启动时加载
private Dictionary<string, BookTableData> _dataStore;

private void Form_Load(object sender, EventArgs e)
{
    LoadDataToMemory();
    BindColumnNamesToComboBox();
}

private void LoadDataToMemory()
{
    // 方案1:硬编码初始化
    _dataStore = new Dictionary<string, BookTableData>
    {
        {"P001", new BookTableData { PrimaryKey = "P001", SampleName = "样本A", MeasurementValue = 15.6, Count = 200 }},
        {"P002", new BookTableData { PrimaryKey = "P002", SampleName = "样本B", MeasurementValue = 22.1, Count = 350 }}
        // 更多数据...
    };

    // 方案2:从嵌入式JSON加载(需引用Newtonsoft.Json)
    // var assembly = Assembly.GetExecutingAssembly();
    // using var stream = assembly.GetManifestResourceStream("YourNamespace.DataSource.json");
    // using var reader = new StreamReader(stream);
    // var json = reader.ReadToEnd();
    // var dataList = JsonConvert.DeserializeObject<List<BookTableData>>(json);
    // _dataStore = dataList.ToDictionary(d => d.PrimaryKey);
}

二、ComboBox列名绑定

将列名存入IEnumerable<string>后直接绑定到ComboBox,确保下拉选项与数据列完全一致:

private void BindColumnNamesToComboBox()
{
    // 列名集合,需与实体类属性对应
    IEnumerable<string> columnNames = new List<string>
    {
        "主键列",
        "样本名称",
        "测量值",
        "数量"
    };

    comboBoxColumns.DataSource = columnNames;
    // 设置默认选中项,避免空选
    comboBoxColumns.SelectedIndex = 0;
    // 禁止用户手动输入无效列名
    comboBoxColumns.DropDownStyle = ComboBoxStyle.DropDownList;
}

三、防错性处理

1. 输入实时验证

对TextBox的首列输入做格式校验,用ErrorProvider实时提示错误:

private ErrorProvider _errorProvider = new ErrorProvider();

private void txtPrimaryKey_Validating(object sender, CancelEventArgs e)
{
    var input = txtPrimaryKey.Text.Trim();
    if (string.IsNullOrEmpty(input))
    {
        e.Cancel = true;
        _errorProvider.SetError(txtPrimaryKey, "请输入主键值");
        return;
    }

    // 如果主键是数字类型,额外校验格式
    // if (!int.TryParse(input, out _))
    // {
    //     e.Cancel = true;
    //     _errorProvider.SetError(txtPrimaryKey, "请输入有效的数字主键");
    // }
    // else
    // {
    //     _errorProvider.SetError(txtPrimaryKey, "");
    // }
}

2. 查询逻辑防错

查询时逐层校验输入有效性与数据存在性:

// 全局变量存储查询结果
private object _currentResult;

private void btnGetValue_Click(object sender, EventArgs e)
{
    var inputKey = txtPrimaryKey.Text.Trim();
    var selectedColumn = comboBoxColumns.SelectedItem.ToString();

    // 校验输入非空
    if (string.IsNullOrEmpty(inputKey))
    {
        MessageBox.Show("请先输入主键值");
        return;
    }

    // 校验主键存在
    if (!_dataStore.ContainsKey(inputKey))
    {
        MessageBox.Show("输入的主键不存在,请检查");
        return;
    }

    var targetRow = _dataStore[inputKey];
    object resultValue = null;

    // 根据选中列名获取对应值(用switch避免反射的性能损耗)
    switch (selectedColumn)
    {
        case "主键列":
            resultValue = targetRow.PrimaryKey;
            break;
        case "样本名称":
            resultValue = targetRow.SampleName;
            break;
        case "测量值":
            resultValue = targetRow.MeasurementValue;
            break;
        case "数量":
            resultValue = targetRow.Count;
            break;
        default:
            MessageBox.Show("选择的列无效");
            return;
    }

    // 将结果存储到内存
    _currentResult = resultValue;
    MessageBox.Show($"查询结果:{resultValue}");
}

四、额外优化建议

  • 给TextBox添加输入限制(比如数字类型只允许输入数字),进一步降低无效输入概率
  • 如果数据更新频率极低,可将数据编译到程序集中,避免外部文件依赖
  • 批量导入数据时,添加数据校验逻辑,确保导入的Excel/CSV数据格式符合要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:46:08