繁体   English   中英

为什么完全相同的代码产生不同的结果?

[英]Why does the exact same code produce different results?

在这段代码之后:

    if ((App.roamingSettings.Values.ContainsKey("FromMonthSection1")) &&
        (!string.IsNullOrWhiteSpace(App.roamingSettings.Values["FromMonthSection1"].ToString())))
    {
        comboBoxFromMonth.SelectedValue = App.roamingSettings.Values["FromMonthSection1"].ToString();
    }
    if ((App.roamingSettings.Values.ContainsKey("FromDaySection1")) &&
        (!string.IsNullOrWhiteSpace(App.roamingSettings.Values["FromDaySection1"].ToString())))
    {
        comboBoxFromDay.SelectedValue = App.roamingSettings.Values["FromDaySection1"].ToString();
    }

...按预期运行,comboBoxFromMonth的SelectedValue =“August”。 但是,comboBoxFromDay的SelectedValue = null,即使在立即窗口中,我看到:

App.roamingSettings.Values["FromDaySection1"].ToString()
"16"
comboBoxFromDay.Items.Count
31

单步执行它,赋值语句在两种情况下运行,即使在由于某种原因赋值后,comboxFromDay.SelectedValue也是null。

那么可能有什么不同,导致这些相反的反应与完全相同的代码?

有问题的两个组合框的xaml是:

<ComboBox x:Name="comboBoxFromMonth" Height="24" Width="100" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="4" LostFocus="ComboBox_OnLostFocus" ></ComboBox>

<ComboBox x:Name="comboBoxFromDay" Grid.Row="1" Grid.Column="1" Height="24" Width="80" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="2" LostFocus="ComboBox_OnLostFocus"/>

除了comboBoxFromMonth没有明确的Grid.Row或Grid.Column赋值之外,XAML实际上完全相同。

此外,设置漫游值完全相同:

if (cmbxName == "comboBoxFromMonth")
{
    App.roamingSettings.Values["FromMonthSection1"] =
        comboBoxFromMonth.SelectedValue;
}
else if (cmbxName == "comboBoxFromDay")
{
    App.roamingSettings.Values["FromDaySection1"] =
        comboBoxFromDay.SelectedValue;
}

那么在一种情况下它是如何工作的呢?而另一种情况则不然呢?

顺便说一句,在两个组合框的属性窗格中查看的属性也是相同的(当然除了Name;和MaxDropDownHeight - 520 vs. Infinity,但我确定这是无关紧要的)。

已解决(或者我认为)

布兰登击中头部:删除“.ToString()”:

if ((App.roamingSettings.Values.ContainsKey("FromDaySection1")) &&
    (!string.IsNullOrWhiteSpace(App.roamingSettings.Values["FromDaySection1"].ToString())))
{
    comboBoxFromDay.SelectedValue = App.roamingSettings.Values["FromDaySection1"];
}

...作品。

UPDATE

好吧,毕竟它还没有完全解决; 我注意到有一些奇怪的事情:

漫游设置引擎显然决定了您要保存的值的数据类型。

如果保存诸如“January”之类的值,则将其保存为字符串。 如果保存诸如“1”到“12”之类的值,则将其保存为int。

但是,如果您有诸如“00”(适当地被视为字符串)和诸如“10”到“59”之类的值的值,该怎么办? 虽然存储在同一个桶中(例如,“ToMinuteSection1”),但数据类型将变形。

这是有道理的,因为桶一次只有一个值。 如果它是“00”,它被视为一个字符串; 如果它是“10”,它被视为一个int。

但是这在检索这些值时会有点麻烦,因为如果“ToMinuteSection1”中包含的值是一个字符串(例如“00”),它就会起作用:

comboBoxToMinute.SelectedValue = App.roamingSettings.Values["ToMinuteSection1"].ToString();

...但是如果该值被视为int(例如“59”)则不会; 那么它需要是:

comboBoxToMinute.SelectedValue = App.roamingSettings.Values["ToMinuteSection1"];

所以...因为我不知道用户将选择什么,我可以这样做,但它似乎是我应该被打的东西:

int toMinute;
string toMinuteStr = App.roamingSettings.Values["ToMinuteSection1"].ToString();
bool isInt = int.TryParse(toMinuteStr, out toMinute);
if (isInt) // it should alway be an int now
{
    if (toMinute < 10)
    {
        comboBoxToMinute.SelectedValue = toMinuteStr;
    }
    else
    {
        comboBoxToMinute.SelectedValue = toMinute;
    }
}

......实际上,我首先尝试这样做:

int toMinute;
string toMinuteStr = App.roamingSettings.Values["ToMinuteSection1"].ToString();
bool isInt = int.TryParse(toMinuteStr, out toMinute);
if (isInt)
{
    comboBoxToMinute.SelectedValue = toMinute;
}
else
{
    comboBoxToMinute.SelectedValue = toMinuteStr;
}

...但是这个技巧不起作用,因为“09”被解析为9就好了,但是赋值是空的,因为组合框中没有“9”,只是“09”

是否有一种更优雅的方式来实现这一目标(比我上面显示的我的防守方法)?

comboBox中的值是整数还是字符串? 根据MSDN文档的备注,如果您为SelectedValue设置的值不在comboBox中,则它会清除选择(即将其设置为null)。 如果它们是整数,则ToString()可能找不到匹配项。

由于你遇到了不同的问题,我不知道最好是添加一个新的答案,还是编辑我之前的答案。 既然你问了一个不同的问题,我认为添加一个新答案更有意义,但我会让mods对它进行排序。

从你所描述的内容来看,听起来你的comboBox实际上只能包含整数0 - 59,但你希望它们全部显示为2位数(任何小于10的数字都应该有一个前导零)。

如果是这种情况,请查看ComboBox上的ItemStringFormat属性。 原谅我说明显而易见的,但是这允许你指定一个格式字符串来显示你的comboBox中的项目。 您可以使用标准的.NET格式字符串来指定前导零,并使用整数来填充comboBox。 希望这会照顾你的“类型变形”问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM