繁体   English   中英

如何通过变量引用修改控件属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM