双按钮分别打开对应客户/供应商表单且单按钮仅可打开一次的功能异常排查
解决表单重复打开的判断异常问题
我懂你的困扰——你做了两个按钮分别打开客户和供应商表单,要求每个按钮只能打开对应类型的表单一次,但现在只有第一个打开的表单能限制重复操作,另一个按钮点多少次就会弹多少次对应表单,对吧?
先拆解下你原代码的问题:
你用Application.OpenForms[frm.Name]查找已打开的表单,但客户和供应商表单应该是同一个窗体类实例化出来的,它们的Name属性是完全相同的!比如你的窗体类叫InfoForm,那不管是客户实例还是供应商实例,Name都是InfoForm。
所以当你先打开了客户表单,再点击供应商按钮时,Application.OpenForms[frm.Name]找到的是已经打开的客户表单,它的Text和供应商按钮的Caption不匹配,你的代码就会执行frm.Show(),直接新打开一个供应商表单,而且每次点击都会重复这个逻辑,自然就出现无限弹窗的问题了。
修正方案
核心思路是精准定位对应类型的已打开表单,不要只依赖窗体Name,而是用能区分客户/供应商的标识(比如你用到的Text,或者更靠谱的自定义属性)。
给你调整后的可用代码:
// 先把目标表单的标识(按钮的Caption)存起来 string targetFormTitle = e.Item.Caption; // 遍历所有打开的表单,精准找到对应类型的实例 var existingForm = Application.OpenForms.Cast<Form>() .FirstOrDefault(form => form.Text == targetFormTitle); if (existingForm != null) { // 找到对应表单就把它调到前台,无需新打开 existingForm.BringToFront(); } else { // 没找到就实例化新表单,设置对应标题和数据 var newInfoForm = new YourFormClass(); // 替换成你的实际窗体类名 newInfoForm.Text = targetFormTitle; // 根据标题加载对应类型的数据逻辑 if (targetFormTitle == "客户信息") { // 写加载客户数据的代码,比如绑定数据源、设置控件内容等 } else if (targetFormTitle == "供应商信息") { // 写加载供应商数据的代码 } newInfoForm.Show(); }
额外优化建议
如果以后你的窗体Text可能会被修改(比如做本地化或者动态调整),用Text判断就不太稳妥了。你可以给窗体类加个自定义属性来区分类型:
// 先定义枚举区分类型 public enum FormDataType { Customer, Supplier } // 在窗体类里加属性 public FormDataType CurrentDataType { get; set; }
之后查找表单时就用这个属性判断,稳定性更高:
.FirstOrDefault(form => form is YourFormClass infoForm && infoForm.CurrentDataType == targetType);
内容的提问来源于stack exchange,提问作者mohamed shemis
相关产品推荐
相关产品推荐

