2017-01-26 1 views
0

Это мой первый пост. Так что..критик всегда приветствуется.C# Доступ к массиву меток из другой формы и изменение их свойства «Текст»

Мой вопрос прямолинейный, просто взглянув на заголовок. Как использовать цикл для вставки значений в разные метки с помощью их ссылки (get, set methods находятся в другой форме)

Что я пытался создать массив со ссылками на эти метки. Дело в том, что оно присваивает новые значения массиву, а не заменяет ссылку, которая изменит метку.

Мне сложно объяснить это дальше. Если у вас есть какие-либо вопросы, я постараюсь ответить на них лучше, насколько мне известно

private void button1_Click(object sender, EventArgs e) 
    { 
     int numOfPeriods = Convert.ToInt32(cmbPeriods.Text)-1; 
     string initialString = cmbStartTime.Text; //Gets the input from combo box "cmbStartTime". 
     string newTime; 
     decimal dec = Convert.ToDecimal(TimeSpan.Parse(initialString).TotalHours); //Converts the set by user Lesson start time to a decimal value. 
     decimal dec2; 
     decimal lessonLength = 1; // Default lesson length is set to 1 hour. 

     TimeSpan time; 
     Test FormOpen = new Test(); 

     string[] periodStartTimes = new string[9] //Loop referencing the labels on Form TEST 
     { 
      FormOpen.startTime,FormOpen.startTime2, FormOpen.startTime3, FormOpen.startTime4, 
      FormOpen.startTime5, FormOpen.startTime6, FormOpen.startTime7, FormOpen.startTime8, 
      FormOpen.startTime9 
     }; 

     if (cmbLessonLength.Text != "") //If the combo box "cmbLessonLength" is not empty, use that value instead of the default lesson lenght. 
     { 
      lessonLength = Convert.ToDecimal(cmbLessonLength.Text)/60; //Converts minutes to hours. 
     } 

     dec2 = dec + lessonLength; 
     time = TimeSpan.FromHours(Double.Parse(dec2.ToString())); 
     newTime = time.ToString(); 

     if (newTime[0] == '0') 
     { 
      FormOpen.startTime = initialString + " - " + newTime.Remove(5).Remove(0, 1); 
     } 
     else 
     { 
      FormOpen.startTime = initialString + " - " + newTime.Remove(5); 
     } 

     for (int x = 1; x <= numOfPeriods; x++) //LOOP THAT ASSIGNS VALUES TO THE ARRAY AND NOT THE REFERENCE INSIDE IT 
     { 
      decimal workingNumber = lessonLength*x; 
      decimal Convert0 = dec + workingNumber; 
      TimeSpan Convert1 = TimeSpan.FromHours(Double.Parse(Convert0.ToString())); 
      string Convert2 = Convert1.ToString().Remove(5); 
      periodStartTimes[x] = Convert2; 
     } 

     FormOpen.subjectName = cmbSubjects.Text; 
     FormOpen.startTime2 = periodStartTimes[1]; //IT DOES WORK LIKE THIS 
     FormOpen.startTime3 = periodStartTimes[2]; 

     FormOpen.ShowDialog(); 

    } 

Я представил весь код, так что ясно, и если есть более эффективный способ кодирования это я был бы очень благодарен, если кто-то может дать мне несколько советов.

ответ

0

Ваш код не может работать, используя этот массив periodStartTimes Это массив строк и при инициализации вы получите значение свойства (т.е. текущий текст меток) не является ссылкой на имущество, которое вы можете используйте для изменения меток.

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

Так, например, ваш тест класс формы может иметь открытый метод, названный как SetTextLabel

public class Test : Form 
{ 
    .... 
    public void SetLabelText(string name, string value) 
    { 
     switch(name) 
     { 
      case "startTime": 
       this.labelForStartTime.Text = value; 
       break; 
      case "label1": 
       this.firstLabelToUpdate.Text = value; 
       break; 
      ... 
      // and so on for all other labels 
     } 
    } 
} 

Таким образом, код, который изменяет метку внутри класса Test, и вы можете добавить все проверки и проверки необходимых с полным доступом ко всем внутренним переменным класса Test.

Теперь ваш цикл можно переписать в виде

for (int x = 1; x <= numOfPeriods; x++) 
{ 
    decimal workingNumber = lessonLength*x; 
    decimal Convert0 = dec + workingNumber; 
    TimeSpan Convert1 = TimeSpan.FromHours(Double.Parse(Convert0.ToString())); 
    string Convert2 = Convert1.ToString().Remove(5); 
    FormOpen.SetLabelText("label" + x.ToString, Convert2; 
} 

Конечно теперь вам не нужно больше массив, и это, вероятно, удалить другую ошибку, присутствующую в реальном коде. Массив фиксируется на 9 элементов, но вы цикл для numOfPeriods начиная с 1 (таким образом, пропуская первый элемент), и если numOfPeriods больше, чем 8 ваш код будет врезаться за исключением IndexOutOfRange

Смежные вопросы