Bice90 Ответов: 1

Не удается получить доступ к массиву в новой форме, C#


Дорогие Все,

Я немного застрял со своим проектом, и мне нужна небольшая помощь. Я использую Visual Studio 2017 для C#.

В основном моя проблема заключается в том, что я не могу получить доступ к массиву в форме 2, который создается в форме 1. Но проблема немного забавная. Я создаю матрицу в форме 1, которая будет использоваться в качестве растрового изображения в форме 2. Поэтому я генерирую некоторую матрицу в форме 1 на основе некоторых экспериментальных данных, а затем я могу передать этот массив и количество его столбцов и строк в форму 2, а затем я могу показать его там в виде растрового изображения.

У меня также есть небольшой фрагмент кода, который показывает координаты X и Y изображения, если я нажимаю на него. Это очень важно для меня, потому что на основе этих координат я могу искать значения в разных других массивах. У меня есть один массив, который составляет изображение в виде растрового изображения, но я назначаю много других данных для каждого пикселя и хочу хранить их в разных массивах.

Каков самый простой способ сделать массив и его значения видимыми в Form2? Я не хочу редактировать массивы из Form2, я просто хочу иметь возможность читать их. Поэтому, когда я нажимаю на картинку, я могу посмотреть значения, соответствующие координатам.

Спасибо Вам за помощь и советы!

Что я уже пробовал:

В форме 1 эта часть кода работает:
Form2 newForm2 = new Form2(); //initialize a new form = Form2
               newForm2.ShowSLImg(ROWS, COLUMNS, array2D); //pass the values to the Form2's function
                newForm2.Show(this); //show the form2.

Затем в Form2 я использую функцию:
public void ShowSLImg(int _row, int _column, double[,] aarray2D)
        {...dosomething...}


Таким образом, я могу передать array2D и строки, столбцы в Form2, и я могу работать с ним, и на основе значений array2D я могу показать растровое изображение в Form2.

В этой части кода я могу получить координаты положения мыши, а также я могу сделать что-то на основе цвета. Но я хотел бы расширить эту функцию и иметь возможность искать различные массивы на основе координат x,Y.

public void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
           
            Color color = image2.GetPixel(e.X, e.Y); //Get the pixel color as RGB

            double Red = color.R; //Get only the RED color

            label1.Text = (Red / 255).ToString(); 

            int _x = Convert.ToInt32(e.X);
            int _y = Convert.ToInt32(e.Y);

            TextBox.Text += "X: "+_x.ToString() + " Y: " + _y.ToString() +Environment.NewLine;
 
        }

1 Ответов

Рейтинг:
4

OriginalGriff

Таким образом, вы используете параметр array2D для построения своего растрового изображения, но хотите получить к нему доступ leter in
код формы Form2?
Это просто: просто объявите закрытую переменную и попросите ее ссылаться на параметр массива:

private int rows = 0;
private int columns = 0;
private double[,] array2D = null;
public void ShowSLImg(int _row, int _column, double[,] aarray2D)
   {
   rows = _row;
   columns = _column;
   this.array2D = aarray2D;
   ...dosomething...
   }
Затем вы можете получить доступ к необработанным данным из любой части вашего кода Form2.


Bice90

Дорогой OriginalGriff,

Спасибо за Ваш быстрый ответ! Я думаю, что мое описание было немного бедным.

Итак, у меня есть этот array2D, который содержит пиксели растрового изображения. Я использую его, чтобы показать только картинку.

Тогда я хотел бы иметь несколько разных массивов в форме 1, с одинаковыми размерами, но с разными данными. Поэтому, когда я нажимаю на изображение, созданное из array2D, я вижу координаты, и поэтому я могу искать соответствующие данные в другом массиве, основываясь на координатах.

В принципе, я использую array2D, чтобы показать понятное изображение, а затем я хочу напечатать некоторые цифры в текстовом поле в Form2, когда я нажимаю на определенную часть изображения.

Что-то вроде: при нажатии на изображение в форме Form2 -&ГТ; получение Х,Y -и GT; найти соответствующие X и Y в какой-то другой массив в файле form1 -&ГТ; распечатать значение somerandomarray[Х,Y], чтобы текстовое поле в форме Form2.

Единственное, чего я не могу понять, так это как сделать массив в форме 1 видимым для всей формы 2?

Спасибо!

OriginalGriff

Это не очень хорошее решение - оно "блокирует" две формы вместе, и это очень плохо с точки зрения Упс.
Есть еще два подхода:
1) Создайте событие в Form2, которое обрабатывает Form1 - это говорит о том, что "я был нажат". Затем Form1 извлекает местоположение щелчка из свойства Form2, обрабатывает его и передает информацию обратно в form2 либо через свойство, либо через метод. Именно так работает большая часть .NET.
2) Создайте метод делегата в форме 1, который вызывается из формы 2 (например, передавая делегат в конструктор) и который принимает данные щелчка и возвращает обработанные данные. Это немного более грязно, но, вероятно, немного быстрее выполнить.

И то и другое звучит сложно, но на самом деле это не так.
Видеть здесь:
https://www.codeproject.com/Tips/548131/Transferring-information-between-two-forms-Part
Он показывает, как сделать первый метод.

Bice90

Большое спасибо! Я действительно ценю, что вы вдавались в детали.

OriginalGriff

Всегда пожалуйста!