簡體   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