[英]Why does Double.ToString("#") and BigInteger.ToString() produce different results for the same value?
[英]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"];
}
...作品。
好吧,畢竟它還沒有完全解決; 我注意到有一些奇怪的事情:
漫游設置引擎顯然決定了您要保存的值的數據類型。
如果保存諸如“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.