提问人:Dan Sanchez 提问时间:1/22/2019 更新时间:1/22/2019 访问量:84
如何通过变量引用修改控件属性
How to modify control properties through variable reference
问:
我一直在努力使我的项目更加模块化。我想做的是让多个按钮在执行类似操作时使用相同的功能,但具有不同的值。我一直试图将其应用于以下情况: “单击此按钮时,让用户选择一个图像,然后让 PictureBox 显示所选图像”。每个按钮都有自己的 PictureBox。所有控件均已在运行时之前创建。 希望这是有道理的!
我的最后一次尝试可以在下面的代码中看到 - 我尝试将 Controls(Button 和 PictureBox)分配给要一起存储在类中的变量。其中有 6 个类都包含在一个列表中。 我还尝试仅存储控件名称,然后使用它。Controls.Find 检索控件。 我尝试了很多较小的更改,例如通过引用传递,使列表静态化,诸如此类的事情会(以某种方式)神奇地解决问题 - 我已经绝望了。
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.FromFile(ofd_png.文件名);
程序抛出 NullReferenceException ,但 clickedcontrol 在本地监视中被识别,并且score_image被记录为 PictureBox(它应该是)。
当我在类中保留控件名称时,我已将此行分解为多行,但以下行产生了 NullReferenceException:
Control[] find_control = 这个。Controls.Find(clicked_control.score_picture, true);
在本例中,clicked_control.score_picture 将是包含 PictureBox 名称的字符串。同样,本地观察表明它clicked_control不是空的,score_picture也不是空的。
如果能帮助弄清楚如何正确地将控件存储在变量中,以便以后用于修改该控件的属性,我们将不胜感激。
答:
Dontpanic 能够帮助我解决这个问题。问题实际上出在此代码之外 - 它与行有关。score_image初始化为数组的方式不正确。修复使一切正常。score_image[clicked_control.picture_index] = ofd_png.FileName;
评论
score_image[clicked_control.picture_index] = ofd_png.FileName;