2017-12-15 4 views
0

私は天気アプリケーションを作成しようとしています。コンボボックスに新しい都市を入力すると、ラベルやピクチャボックスが更新されません。私はすでにRefresh()Update()Invalidate()を試していて、どれもうまくいきませんでした。私が言うべきことを私に教えてください。前もって感謝します!ループWinformsのいくつかのコントロールのリフレッシュ

private async void SetWeatherForecastDataToWeatherApp(string city) 
    { 
     try 
     { 
      var jsonData = string.Empty; 
      var url = string.Format("http://api.openweathermap.org/data/2.5/forecast?q={0}&APPID=a54961a05f7a1fc0cf9bd2bf1465dea5", city); 
      var uri = new Uri(url); 
      var request = WebRequest.Create(uri); 
      var response = await request.GetResponseAsync(); 

      using (var stream = response.GetResponseStream()) 
      { 
       using (var streamReader = new StreamReader(stream)) 
       { 
        jsonData = await streamReader.ReadToEndAsync(); 
       } 
      } 
      response.Close(); 

      _jsonFutureWeatherForecastData = jsonData; 

      _weatherForecast = JsonConvert.DeserializeObject<WeatherForecast>(_jsonFutureWeatherForecastData); 
     } 
     catch (Exception ex) 
     { 

      MessageBox.Show(ex.Message, "Input Error", MessageBoxButtons.OK); 
     } 


     var dayNameLabelList = new List<Label>(); 
     var weatherDescriptionLablList = new List<Label>(); 
     var gradesLabel = new List<Label>(); 

     var pictureBoxList = new List<PictureBox>(); 

     int yLocation = 50; 
     int xLocation = Width/2; 
     int cnt = 0; 


     string currDayOfWeek = string.Empty; 
     string CurrentDate = string.Empty; 

     for (int i = 0; i < 9; i++) 
     { 

      currDayOfWeek = _dateConverter.ConvertMilisecondsToCurrentTime(_weatherForecast.WeatherList[i].CurrentDate).DayOfWeek.ToString(); 
      CurrentDate = _dateConverter.ConvertMilisecondsToCurrentTime(_weatherForecast.WeatherList[i].CurrentDate).Day.ToString(); 

      cnt++; 
      pictureBoxList.Add(new PictureBox()); 
      pictureBoxList[i].Name = "WeatherForecastImage" + cnt.ToString(); 
      pictureBoxList[i].Location = new Point(xLocation, yLocation); 
      pictureBoxList[i].Load($"Icons/{_weatherForecast.WeatherList[i].Weather[0].Icon}.png"); 
      Controls.Add(pictureBoxList[i]); 
      pictureBoxList[i].Invalidate(); 

      dayNameLabelList.Add(new Label()); 
      dayNameLabelList[i].Text = currDayOfWeek + " " + CurrentDate; 
      dayNameLabelList[i].Location = new Point(xLocation + 100, yLocation); 
      dayNameLabelList[i].Size = new Size(100, 15); 
      dayNameLabelList[i].Font = new Font("Lucida Sans", 10, FontStyle.Regular); 
      Controls.Add(dayNameLabelList[i]); 

      weatherDescriptionLablList.Add(new Label()); 
      weatherDescriptionLablList[i].Text = _weatherForecast.WeatherList[i].Weather[0].Description; 
      weatherDescriptionLablList[i].Location = new Point(xLocation + 100, yLocation + 15); 
      weatherDescriptionLablList[i].Font = new Font("Lucida Sans", 8, FontStyle.Regular); 
      Controls.Add(weatherDescriptionLablList[i]); 

      gradesLabel.Add(new Label()); 
      gradesLabel[i].Text = _weatherForecast.WeatherList[i].Main.Temperature.ToString("0") + " C°"; 
      gradesLabel[i].Location = new Point(xLocation + 200, yLocation); 
      gradesLabel[i].Font = new Font("Lucida Sans", 10, FontStyle.Regular); 
      Controls.Add(gradesLabel[i]); 

      yLocation += 100; 
     } 

     for (int i = 0; i < dayNameLabelList.Count; i++) 
     { 
      dayNameLabelList[i].ForeColor = Color.White; 
      weatherDescriptionLablList[i].ForeColor = Color.White; 
      gradesLabel[i].ForeColor = Color.White; 
     } 
    } 
+0

これらの個々のコントロールの代わりにUserControlを作成することをお勧めします。また、[お問合せ]を読んで[ツアー]を取ることをお勧めします – Plutonix

+0

いつ更新する予定ですか?ループの中に追加されるか、またはメソッドが終了した後に? – Enigmativity

+0

@Enigmativy私はループ内とメソッド終了後にメソッドを更新しようとしましたが、うまくいきませんでした。 – Vadim

答えて

-1

あなたはそれが(おそらく両方後者の場合)であればSelectedIndexChangedEvent(それは編集不可能なコンボの場合)、またはTextUpdateEventのいずれかのためにコンボにイベントハンドラを追加する必要があります。これらのイベントハンドラは、必要に応じて他のコントロールを変更します。