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

点击按钮生成的Barcode切换文本框后消失问题求助

解决点击其他文本框时txtBarcode内容消失的问题

看起来你已经搞定了唯一条码生成的核心逻辑,但遇到了焦点切换时文本框内容丢失的小坑。我来帮你分析原因并给出解决方案:

首先,先优化你的条码生成逻辑(顺带解决潜在重复问题)

你当前的BarcodeGenerator方法每次都新建Random实例,短时间内多次调用会因为系统时钟种子重复导致生成相同的数。而且原来的逻辑如果第一次生成的条码已存在,只重试一次就返回,可能还是重复。咱们先把这个逻辑优化得更可靠:

// 把Random实例设为类的私有字段,只初始化一次
private readonly Random _barcodeRandom = new Random();
// 用类私有字段存储生成的条码,比全局变量更规范
private int _generatedBarcode;

private void btnBarkodOlustur_Click(object sender, EventArgs e) {
    GenerateUniqueBarcode();
    txtBarcode.Text = _generatedBarcode.ToString();
}

private void GenerateUniqueBarcode() {
    string barcodeStr;
    do {
        _generatedBarcode = _barcodeRandom.Next(10000000, 99999999);
        barcodeStr = _generatedBarcode.ToString();
        // 循环检查直到生成唯一条码
    } while (context.Stocks.Any(c => c.Barcode == barcodeStr) || 
             context.Units.Any(c => c.Unit == barcodeStr));
}

核心问题:txtBarcode内容消失的原因及解决

1. 数据绑定是最常见的元凶

如果你的txtBarcode绑定了某个数据源(比如Stock或Unit实体的属性),当焦点离开文本框时,数据绑定框架会自动把文本框的值同步回数据源,但如果数据源的原始值是空的,就会把文本框重置为空。

解决方法:

  • 如果你不需要绑定,直接解除绑定:在设计器里找到txtBarcode的DataBindings属性,清空所有绑定项;
  • 如果需要绑定,生成条码后同步更新绑定的实体对象:
    private void btnBarkodOlustur_Click(object sender, EventArgs e) {
        GenerateUniqueBarcode();
        string barcodeStr = _generatedBarcode.ToString();
        txtBarcode.Text = barcodeStr;
        // 假设你绑定的是当前选中的Stock实体
        if (currentSelectedStock != null) {
            currentSelectedStock.Barcode = barcodeStr;
        }
    }
    

2. 意外的事件触发重置

检查以下几个地方:

  • 查看txtBarcode的LostFocus或Leave事件,有没有写过清空文本的代码;
  • 查看其他文本框的GotFocus事件,有没有不小心修改了txtBarcode.Text;
  • 查看表单的Load或Activated事件,有没有重复初始化txtBarcode的逻辑。

如果找到这类代码,直接删除或修改即可。

3. 排查触发源(调试技巧)

如果还是找不到原因,可以给txtBarcode的TextChanged事件加个调试输出,看看什么时候文本被修改了:

private void txtBarcode_TextChanged(object sender, EventArgs e) {
    // 输出到Visual Studio的输出窗口,查看触发时机和调用栈
    System.Diagnostics.Debug.WriteLine($"txtBarcode内容被修改为: {txtBarcode.Text}");
    // 可以查看调用栈定位是谁修改的
    System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace();
    System.Diagnostics.Debug.WriteLine($"调用栈: {stackTrace.ToString()}");
}

运行程序后,点击其他文本框时,查看输出窗口的信息,就能精准定位到修改文本的代码位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:29:44