2017-01-26 3 views
0

これは私の最初の投稿です。だからクリティークはいつも歓迎されている。C#別のフォームからラベルの配列にアクセスし、 "Text"プロパティを変更する

私の質問はタイトルを見るだけで直進です。 参照を使用してループを使用して別のラベルに値を挿入するにはどうすればいいですか?

私が試みたのは、ラベルの参照を使用して配列を作成することでした。それはラベルを変更する参照を変更するのではなく、新しい値を配列に割り当てます。

これ以上説明するのは少し難しいです。ご質問があれば することは、私は、全体のコードを提供しているので、それは明確だと、これをコーディングするより効率的な方法があるのなら、私がもし本当に感謝するでしょう

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

これは、文字列の配列であり、あなたがそれを初期化するときに、プロパティの値(IEラベルの現在のテキスト)でないプロパティへの参照を取得し、その配列に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クラスのすべての内部変数に完全にアクセスできます。

今、あなたのループは、今はもう、配列を必要としません。もちろん、

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例外でクラッシュします

関連する問題