Я работаю над тем, чтобы сделать мой проект более модульным. Что-то, что я хотел сделать, - это чтобы несколько кнопок использовали одну и ту же функцию, когда они выполняют похожее действие, но с разными значениями. Я застрял при попытке применить это к следующей ситуации:
«При нажатии этой кнопки пользователь должен выбрать изображение, а затем в 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.
Любая помощь, выясняющая, как правильно хранить элемент управления в переменной, которая впоследствии будет использоваться для изменения свойств этого элемента управления, будет принята с благодарностью.