我已将Label
类扩展如下:
public class MyLabel: Label {
public Button btn;
public string mydata;
}
在我的主程序中,我实例化了一个新实例:
MyLabel lbl = new MyLabel();
lbl.mydata = "some data here";
lbl.btn = new Button();
lbl.btn.Click += new EventHandler(button_pressed);
this.Controls.Add(lbl); // Adds the label to the form
this.Controls.Add(lbl.btn); // Adds the button to the form
我创建了一个处理按钮点击事件的方法:
void button_pressed(Object sender, EventArgs e) {
Button btn = (Button)sender;
//Now I have an access to the property within MyLabel instance.
// but how can I access the parent object?
// I need to access the sibling property [mydata] string from here
btn.Siblings["mydata"] = "some other thing" ; //Something like this
MyLabel lbl = btn.ParentObject(); //Or something like this
lbl.mydata = "Some other thing";
}
答案 0 :(得分:2)
这看起来像 WinForms ,在这种情况下, UserControl 或扩展Button
类可能是一个好方法 - 只需保持对parent(使用 UserControl 稍微复杂一点,你需要在该控件上定义click事件,否则你会回到" square 1")I就像Tag
属性解决方案一样,虽然有一个额外的强制转换,并且不保证类型安全(因为Tag
是object
,所以当你尝试时它可以是任何东西访问它)。
但是,让我们说你正在寻找更通用的解决方案;我们还要说有问题的课程是sealed
,没有Tag
或类似的目的属性,并且Controls
集合不可用(或者循环使用它是不可取的出于性能原因)。据我所知,你无法确定父对象;但你可以很容易地提供自己的"控制"样式字典,将Button
映射到父级:
public class MyLabel: Label {
public static Dictionary<Button, MyLabel> ParentMap = new Dictionary<Button, MyLabel>();
public Button btn;
public string mydata;
public void AddToParentMap() => ParentMap[btn] = this;
}
当您创建MyLabel
的实例时,只需调用AddToParentMap()
函数(无法在constructor
中完成,因为this
指针在创建对象之前不可用):
MyLabel lbl = new MyLabel();
lbl.AddToParentMap();
然后,您可以在点击活动中快速轻松地查找:
void button_pressed(Object sender, EventArgs e) {
Button btn = (Button)sender;
var label = MyLabel.ParentMap[btn];
//...
//Your code...
}
与Tag
解决方案不同,类型安全性得到保证 - 您始终知道您正在访问MyLabel
对象。
答案 1 :(得分:0)
您无法通过按钮实例访问它,但您可以做的是从MyLabel
集合获取Controls
:
var lbl = this.Controls.OfType<MyLabel>().FirstOrDefault(c => c.btn == btn);
答案 2 :(得分:0)
您可以使用Tag
属性。
lbl.btn = new Button();
lbl.btn.Tag = lbl;
然后当你需要它时:
Button btn = (Button)sender;
Label lbl = (MyLabel)btn.Tag;