Как изменить свойства элемента управления через ссылку на переменную - PullRequest
0 голосов
/ 22 января 2019

Я работаю над тем, чтобы сделать мой проект более модульным. Что-то, что я хотел сделать, - это чтобы несколько кнопок использовали одну и ту же функцию, когда они выполняют похожее действие, но с разными значениями. Я застрял при попытке применить это к следующей ситуации: «При нажатии этой кнопки пользователь должен выбрать изображение, а затем в PictureBox отобразить выбранное изображение». Каждая кнопка имеет свой собственный PictureBox. Все элементы управления были созданы до выполнения. Надеюсь, что это имеет смысл!

Мою последнюю попытку можно увидеть в приведенном ниже коде. Я попытался назначить элементы управления (Button и PictureBox) переменным, которые будут храниться вместе в классе. Есть 6 из этих классов, все включены в один список. Я также пытался сохранить только имена элементов управления, а затем с помощью this.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 = 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 будет строкой, содержащей имя PictureBox. Опять же, местное наблюдение показало, что clicked_control не был нулевым, и ни один из них не был Score_picture.

Любая помощь, выясняющая, как правильно хранить элемент управления в переменной, которая впоследствии будет использоваться для изменения свойств этого элемента управления, будет принята с благодарностью.

1 Ответ

0 голосов
/ 22 января 2019

dontpanic смог мне помочь с этим.Проблема была на самом деле вне этого кода - это было связано со строкой score_image[clicked_control.picture_index] = ofd_png.FileName;.Способ Score_image был инициализирован как массив был неверным.Исправление, которое заставляло все работать отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...