Как бы я это почистил? - PullRequest
1 голос
/ 28 мая 2011

Я работаю с приложением, которое использует Google Weather API, прямо сейчас я получил настоящий уродливый код только для того, чтобы заполнить трехдневный прогноз, который выглядит так (не смеяться)

groupBox3.Text = set.Forecast[1].DayOfTheWeek;
label4.Text = string.Format("High {0}", set.Forecast[1].High);
label3.Text = string.Format("Low: {0}", set.Forecast[1].Low);
label11.Text = string.Format("Condition: {0}", set.Forecast[1].Condition);
pictureBox1.Load(set.Forecast[1].Icon);

groupBox4.Text = set.Forecast[2].DayOfTheWeek;
label14.Text = string.Format("High {0}", set.Forecast[2].High);
label13.Text = string.Format("Low: {0}", set.Forecast[2].Low);
label20.Text = string.Format("Condition: {0}", set.Forecast[2].Condition);
pictureBox2.Load(set.Forecast[2].Icon);

groupBox5.Text = set.Forecast[3].DayOfTheWeek;
label7.Text = string.Format("High {0}", set.Forecast[3].High);
label6.Text = string.Format("Low: {0}", set.Forecast[3].Low);
label11.Text = string.Format("Condition: {0}", set.Forecast[3].Condition);
pictureBox3.Load(set.Forecast[3].Icon);

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

WeatherSet set = WeatherService.Response(GoogleWeatherRequest.RequestData(new WeatherService("99109")));

А внутри переменной set есть информация для текущей информации и прогноз на 3 дня, но ее запуск в таком виде сводит меня с ума, потому что это такнубистский и не очень эффективный.Так у кого-нибудь есть какой-нибудь крутой и эффективный способ выполнить эту задачу?

Ответы [ 4 ]

2 голосов
/ 28 мая 2011

Я думаю, что вы должны создать свой собственный элемент управления ForecastView для этого с групповой коробкой, тремя метками и картинкой на нем. Пусть у него есть свойство с именем Forecast и поместите логику, которая заполняет поля, в его установщик. Таким образом, код формы будет действительно чистым, как

forecastView1.ForeCast = set.Forecast[1];
forecastView2.ForeCast = set.Forecast[2];
// etc

Поскольку вы уже помещаете свое поле в групповое поле, размещение не должно быть проблемой.

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

1 голос
/ 28 мая 2011

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

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

1 голос
/ 28 мая 2011

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

Если вы хотите избежать повторения, просто поместите ваши элементы управления в массивы, чтобы вы могли сделать что-то вроде:

for (index in number of forecasts) {
   groupBox[index].Text = set.Forecast[index]....;
   hiLabel[index].Text  = ...:
   lowLabel[index].Text = ...:
   ...
}
0 голосов
/ 16 июня 2011

Это решение, которым я закончил (спасибо @dyppl).Для идеи управления пользователем

public partial class forecastView : UserControl
{    
    public forecastView()
    {
        InitializeComponent();
    }

    public forecastView(int x, int y, int index,WeatherSet set)
    {
        InitializeComponent();

        label7.Text = string.Format("High:{0}", set.Forecast[index].High);
        label8.Text = string.Format("Low: {0}", set.Forecast[index].Low);
        pictureBox3.Load(string.Format("http://www.google.com/{0}", set.Forecast[index].Icon));
        groupBox1.Text = set.Forecast[index].DayOfTheWeek;

        this.Location = new System.Drawing.Point(x, y);
    }
}

И я загружаю их таким образом

private void LoadControls(WeatherSet set)
{
    RemoveConrols();
    //form2.Dispose();

    form = new forecastView(12, 136, 1, set);
    form1 = new forecastView(155, 136, 2, set);
    form2 = new forecastView(12, 218, 3, set);

    this.Controls.Add(form);
    this.Controls.Add(form1);
    this.Controls.Add(form2);
}

Так что спасибо всем, кто помог мне с этой проблемой;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...