为何用户控件Paint事件中myindex值重置为0?已获取正确索引
问题分析与解决方案
核心问题定位
你遇到的问题大概率是主窗体中操作的用户控件实例不一致:
看主窗体代码里,你调用了histogram.UP()(小写h),但紧接着调用的是Histogram.Invalidate()(大写H)。C#是大小写敏感的语言,这两个变量指向的很可能是两个不同的HistogramaDesenat控件实例——你在histogram实例的UP方法里成功设置了myindex,但触发重绘的却是另一个Histogram实例,这个实例的myindex还是初始值0,所以Paint事件里拿到的就是0。
另外还有一种可能:如果用户控件被意外重新实例化(比如窗体重新加载、控件被动态重建),也会导致myindex回到初始值,但结合你断点看到UP方法生效的情况,实例不一致是最常见的原因。
具体修复步骤
统一控件实例变量名
把主窗体里的调用改成一致的变量名,比如都用histogram:private void listView1_SelectedIndexChanged(object sender, EventArgs e) { if (listView1.SelectedItems.Count > 0) { index = listView1.SelectedIndices[0]; histogram.UP(); histogram.Invalidate(); // 这里改成和前面一致的变量名 } }同时检查主窗体中控件的声明,确保只有一个
HistogramaDesenat实例,且变量名统一。优化数据获取方式(可选但更健壮)
避免依赖字段存储myindex,直接在Paint事件中从主窗体获取最新值,这样能彻底解决同步问题:private void HistogramaDesenat_Paint(object sender, PaintEventArgs e) { if (myIsDrawing && mainForm != null) { int currentIndex = mainForm.index; // 直接取主窗体的最新值 // ... 其他绘图代码 ... g.DrawLine(myPen1, new PointF(myOffset + (currentIndex * myXUnit), this.Height - myOffset), new PointF(myOffset + (currentIndex * myXUnit), this.Height - myOffset - myValues[currentIndex] * myYUnit)); } }这样就算控件实例有变动,也能拿到最新的选中索引。
检查控件实例是否被重复创建
确认主窗体中没有在其他地方重新初始化HistogramaDesenat控件,比如在Load事件或者其他方法里再次执行histogram = new HistogramaDesenat(this),这会覆盖之前的实例,导致之前设置的myindex丢失。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

