【问题标题】:How to modify control properties through variable reference如何通过变量引用修改控件属性
【发布时间】:2019-06-15 10:42:47
【问题描述】:

我一直致力于使我的项目更加模块化。我想做的是让多个按钮在执行类似操作时使用相同的功能,但具有不同的值。我一直试图将其应用于以下情况: “单击此按钮时,让用户选择图像,然后让 PictureBox 显示所选图像”。每个按钮都有自己的 PictureBox。所有控件都是在运行前创建的。 希望这是有道理的!

我的最后一次尝试可以在下面的代码中看到——我尝试将控件(按钮和图片框)分配给要一起存储在一个类中的变量。这些类中有 6 个都包含在一个列表中。 我还尝试仅存储控件名称,然后使用 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 ,但 clickedcontrol 在 Local Watch 中被识别,并且 score_image 被记录为 PictureBox(应该如此)。

当我改为在类中保存控件名称时,我已将此行分解为多行,但以下行产生了 NullReferenceException:

Control[] find_control = this.Controls.Find(clicked_control.score_picture, true);

在这种情况下,clicked_control.score_picture 将是一个包含图片框名称的字符串。 Local Watch 再次显示 clicked_control 不为空,score_picture 也不为空。

任何帮助弄清楚如何在变量中正确存储控件以供以后用于修改该控件的属性将不胜感激。

【问题讨论】:

  • 无法重现,您的代码在这里工作正常。也许根本原因在其他地方?顺便说一句,我必须注释掉 score_image[clicked_control.picture_index] = ofd_png.FileName; 才能让它工作。
  • 这实际上帮助了很多!原来问题完全在于您注释掉的那一行。我将能够很容易地清理该问题并继续前进。我真的很感激。
  • @dontpanic 您能否考虑将您的评论作为答案,以便在此处接受它作为解决方案。

标签: c# winforms controls nullreferenceexception picturebox


【解决方案1】:

dontpanic 能够帮助我解决这个问题。问题实际上不在此代码范围内 - 它与 score_image[clicked_control.picture_index] = ofd_png.FileName; 行有关。 score_image 初始化为数组的方式不正确。修复后一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2020-09-11
    • 2015-06-01
    相关资源
    最近更新 更多