我该如何清理它?

时间:2011-05-28 07:02:30

标签: winforms c#-4.0

我正在使用一个使用Google Weather API的应用程序,现在我得到了一些真正丑陋的代码,只是为了填充3天的预测,看起来就是这样(记得不笑)

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);
我告诉过你这很难看。我想要做的是有一个循环(和可能的泛型)来完成与这个丑陋的代码相同的任务。我尝试了几种不同的方法,但总是失败。天气正在如此生成

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

在变量设置内部,有关于当前信息和3天预测的信息,但让它像这样运行会让我感到疯狂,因为它如此愚蠢而且效率不高。所以任何人都有任何冷静和有效的方法来完成这项任务?

4 个答案:

答案 0 :(得分:2)

我认为您应该为其创建自己的自定义控件ForecastView,其中包含groupbox,三个标签和图片框。让它有一个名为Forecast的属性,并将填充其setter中字段的逻辑放入其中。这样,表单的代码就会非常干净,比如

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

看到你已经把你的字段放在了组框内,放置应该不是问题。

此外,如果有一天您需要在另一个表单甚至另一个应用程序中显示此数据,那么将它全部置于单独的控件中将为您提供大量代码重用选项。更不用说如果您决定将图片框放在右边而不是右图等,您将能够立即更改所有预测的外观。

答案 1 :(得分:1)

您的代码没有任何低效率。这是一个有点伤感重复自己,但没有什么是真正的错误的吧。

如果你想避免重复,只需将你的控件放在数组中,这样就可以做到:

for (index in number of forecasts) {
   groupBox[index].Text = set.Forecast[index]....;
   hiLabel[index].Text  = ...:
   lowLabel[index].Text = ...:
   ...
}

答案 2 :(得分:1)

您是否尝试过对控件进行分组或动态控制控件?这样您就不必索引预测列表,只需枚举集合,而不是为每次迭代使用不同的控件,只需要填充该单个集合。

foreach (var item in set.Forecast.Take(3))
{
    var groupBox = new GroupBox(); // it don't if the class is actually called GroupBox...
    groupBox.Text = item.DayOfTheWeek;
    labelHigh.Text = string.Format("High {0}", item.High);
    labelLow.Text = string.Format("Low: {0}", item.Low);
    labelCondition.Text = string.Format("Condition: {0}", item.Condition);
    pictureBox.Load(item.Icon);
    groupBox.Controls.Add(labelHigh)
    ...
    this.Controls.Add(groupBox);
}

以上代码只是为了给你一个想法。

实际上,你的代码没有太多可能出错的地方,我唯一真正缺少的是断言你的索引不在范围之外。

答案 3 :(得分:0)

这是我结束的解决方案(感谢@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);
}

感谢所有帮助我解决这个问题的人;)