![](/img/trans.png)
[英]How to use reflection to cast a control as its type in order to modify properties?
[英]How to modify control properties through variable reference
我一直在努力使我的項目更具模塊化。 我想要做的就是讓多個按鈕在執行相似的操作時使用相同的功能,但是它們的值不同。 我一直試圖將其應用於以下情況:“單擊此按鈕時,請用戶選擇圖像,然后讓PictureBox顯示所選圖像”。 每個按鈕都有其自己的PictureBox。 所有控件都在運行時之前創建。 希望有道理!
我的最后一次嘗試可以在下面的代碼中看到-我已經嘗試將Controls(Button和PictureBox)分配給要一起存儲在類中的變量。 這些類中有6個都包含在一個List中。 我還嘗試過僅存儲控件名稱,然后使用this.Controls.Find來檢索控件。 我已經嘗試了一些較小的更改,例如通過引用傳遞,使List靜態化,以及諸如此類的事情(以某種方式)神奇地完成了這一技巧-我已經絕望了。
public class score_control
{
public Button score_button;
public PictureBox score_picture;
public int picture_index;
}
public List<string> score_boxes_names = new List<string>();
public List<score_control> score_boxes = new List<score_control>();
public void add_score_control(Button button, PictureBox pictureBox)
{
score_control new_score = new score_control();
new_score.score_button = button;
new_score.score_picture = pictureBox;
new_score.picture_index = score_boxes.Count();
score_boxes.Add(new_score);
score_boxes_names.Add(button.Name);
}
public score_control find_score_control(string name)
{
int index = score_boxes_names.IndexOf(name);
return score_boxes[index];
}
public frm_settings()
{
InitializeComponent();
add_score_control(btn_score1_image1, pic_score1_image1);
add_score_control(btn_score1_image2, pic_score1_image2);
add_score_control(btn_score1_image3, pic_score1_image3);
add_score_control(btn_score2_image1, pic_score2_image1);
add_score_control(btn_score2_image2, pic_score2_image2);
add_score_control(btn_score2_image3, pic_score2_image3);
}
private void score_button_Click(object sender, EventArgs e)
{
Button image_button = (Button)sender;
if (ofd_png.ShowDialog() == DialogResult.OK)
{
score_control clicked_control = find_score_control(image_button.Name);
score_image[clicked_control.picture_index] = ofd_png.FileName;
clicked_control.score_picture.Image = Image.FromFile(ofd_png.FileName);
}
}
問題似乎集中在以下這一行:
clicked_control.score_picture.Image = Image.FromFile(ofd_png.FileName);
該程序將拋出NullReferenceException,但是在本地監視中會識別出clicked控件,並且score_image被標記為PictureBox(應該是)。
相反,當我將控件名稱保留在類中時,我將此行分解為多行,但以下行產生了NullReferenceException:
Control [] find_control = this.Controls.Find(clicked_control.score_picture,true);
在這種情況下,clicked_control.score_picture將是包含PictureBox名稱的字符串。 同樣,本地監視顯示它的clicked_control不為null,score_picture也不為空。
任何有助於弄清楚如何在變量中正確存儲控件以供以后用於修改控件屬性的幫助將不勝感激。
dontpanic能夠幫助我解決這一問題。 問題實際上不在此代碼范圍內-它與score_image[clicked_control.picture_index] = ofd_png.FileName;
。 將score_image初始化為數組的方式不正確。 修復后,一切正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.