Как я могу изменить целочисленный массив, определенный на уровне класса, с помощью элемента управления кнопки в Windows Forms?

#c# #arrays #visual-studio #winforms

Вопрос:

Я пытаюсь создать программу сортировки с помощью Windows Forms. Цель состоит в том, чтобы позволить пользователю создать массив, взяв значение из трекбара, которое определяет размер массива. Например, если значение трекбара равно 100, то пользователь нажмет кнопку «Создать массив», которая затем сгенерирует массив целых чисел со 100 случайными числами, а затем отобразит их на диаграмме.

Затем пользователь нажимал другую кнопку, чтобы фактически отсортировать массив. Однако, поскольку массив определен в области действия кнопки, которая фактически создает массив, я не знаю, как поместить его в область действия кнопки, которая его сортирует. После того, как он будет отсортирован, я хочу сохранить сортировку массива, поэтому его необходимо изменить на глобальном уровне.

Я попытался определить переменную на уровне класса внутри Form1: Form класса и заставить каждый элемент управления возвращать значение, которое обновило бы значение для массива, но это не работает, потому что в моем проекте нет static void Main() функции, и я не уверен, как реализовать это в Windows Forms с моими текущими минимальными знаниями о программе.

Пример кода приведен ниже:

 public partial class Form1 : Form
    {


        public Form1()
        {
            InitializeComponent();
        }
        // Initializes size of the array.
        public int arraySize;

        // Generates the array and links it to the chart for visualization.
        private void button2_Click(object sender, EventArgs e)
        {
            // the dataArray takes in the arraySize and returns an array
            // which is used to populate the chart.
            arraySize = trackBar1.Value;
            ArrayObject dataGenerator = new ArrayObject();
            int[] dataArray = dataGenerator.GenerateData(arraySize);

            chart1.Series["Data"].Points.Clear();
            int placement = 0;
            foreach (int dataPoint in dataArray)
            {
                this.chart1.Series["Data"].Points.AddXY(placement, dataPoint);
                placement  = 1;
            }
        }

        // updates the label to show the current value that trackBar1 has selected.
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            trackbarValueLabel.Text = trackBar1.Value.ToString();
        }

        private void buttonSort_Click(object sender, EventArgs e)
        {

        }
    }
 

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

Ответ №1:

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

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

 public partial class Form1 : Form
{
    protected int[] _latestArray = new int[] {} ; 

    public Form1()
    {
        InitializeComponent();
    }

    // Initializes size of the array.
    public int arraySize = 0;

    // Generates the array and links it to the chart for visualization.
    private void button2_Click(object sender, EventArgs e)
    {
        // the dataArray takes in the arraySize and returns an array
        // which is used to populate the chart.
        arraySize = trackBar1.Value;
        ArrayObject dataGenerator = new ArrayObject();
        int[] dataArray = dataGenerator.GenerateData(arraySize);

        chart1.Series["Data"].Points.Clear();
        int placement = 0;
        foreach (int dataPoint in dataArray)
        {
            this.chart1.Series["Data"].Points.AddXY(placement, dataPoint);
            placement  = 1;
        }
        //Save state
        _latestArray = dataArray;
    }

    private void buttonSort_Click(object sender, EventArgs e)
    {
        Array.Sort(_latestArray);
    }
}