簡體   English   中英

如何防止RadioGroup嘗試在Focus上設置SelectedItem?

[英]How can I prevent a RadioGroup from trying to set SelectedItem on Focus?

我有一個用枚舉值填充的WinForms RadioGroup。 我的問題是,當控件獲得焦點時,它嘗試使用System.DBNull更新選定的項目,這對於枚舉而言不是有效值,而我最終得到了異常:

類型為“ System.DBNull”的對象不能轉換為類型為“ MyNamespace.MyEnumType”

我有一個自定義的RadioGroup類,其中包含以下代碼,用於添加項目和獲取/設置所選值:

/// <summary>
/// sets the items, using reflection to get the display member and value
/// </summary>
public void SetItems<T>(IEnumerable<T> values, string valueMember, string displayMember)
{
    Type t = typeof(T);

    PropertyInfo displayProperty = t.GetProperty(displayMember);
    PropertyInfo valueProperty = t.GetProperty(valueMember);

    if (displayProperty == null)
        throw new ArgumentException(string.Format("Property {0} is not found on class {1}", displayMember, t.FullName), "displayMember");

    if (valueMember == null)
        throw new ArgumentException(string.Format("Property {0} is not found on class {1}", valueMember, t.FullName), "valueMember");

    Properties.Items.Clear();

    foreach (var val in values)
    {
        object desc = displayProperty.GetValue(val, null);
        Properties.Items.Add(new RadioGroupItem(valueProperty.GetValue(val, null), desc == null ? string.Empty : desc.ToString()));
    }
}

/// <summary>
/// accessor for the selected value
/// </summary>
public object SelectedValue
{
    get { return GetSelectedValue(); }
    set { SetSelectedValue(value); }
}


private object GetSelectedValue()
{
    if (SelectedIndex < 0 || SelectedIndex >= Properties.Items.Count)
    {
        if (DataBindings.Count > 0 && DataBindings["SelectedValue"] != null)
            return DataBindings["SelectedValue"].DataSourceNullValue;
        else
            return null;
    }

    return Properties.Items[SelectedIndex].Value;
}

private void SetSelectedValue(object selectedItem)
{
    SelectedIndex = FindSelectedValue(selectedItem);
}

private int FindSelectedValue(object value)
{
    for (int i = 0; i < Properties.Items.Count; i++)
    {
        object val = Properties.Items[i].Value;

        if ((val != null && val.Equals(value)) || (val == null && value == null))
        {
            return i;
        }
    }

    return -1;
}

這是從文件背后的代碼初始化的方式:

myRadioGroup.SetItems<KeyValuePair<MyEnum, string>>(
    new List<KeyValuePair<MyEnum, string>>() 
    {
        new KeyValuePair<MyEnum, string>(MyEnum.VALUE_A, "Value A"), 
        new KeyValuePair<MyEnum, string>(MyEnum.VALUE_B, "Value B")
    },
"Key", "Value");

// adds the binding
myRadioGroup.DataBindings.Add(new Binding("MyPropertyName", myDataSource, "SelectedValue", true, DataSourceUpdateMode.OnValidation, MyEnum.NONE));

我不清楚我打電話時為什么會收到此異常

myRadioGroup.Focus();

擊中GotFocus事件,並調用SetSelectedValue方法並返回一個正常的null值。 我唯一能想到的是,盡管在構造函數GetSelectedValue DataSourceNullValue設置為MyEnum.NONE ,但GetSelectedValue DataSourceNullValue顯示為System.DBNull,但是即使我在調試模式下進行了糾正,它仍然會給我同樣的異常。

也根據有關此綁定構造器MSDN頁面

從數據源返回DBNull時,[null值參數]將屬性設置為指定的值。

這些是我可以看到的唯一參考DBNull的地方。

有沒有辦法解決此異常,或者阻止RadioGroup在獲得焦點時嘗試更新數據源?

我想我想出了一個解決方案... Binding構造函數設置了.NullValue而我需要設置.DataSourceNullValue

// adds the binding
Binding b = new Binding("MyPropertyName", myDataSource, "SelectedValue", true, DataSourceUpdateMode.OnValidation, MyEnum.NONE);
b.DataSourceNullValue = MyEnum.NONE;
myRadioGroup.DataBindings.Add(b);

根據此MSDN博客文章

DataSourceNullValue指定將數據源的哪個值視為空值,還指定對於值應將哪個值寫回到數據源

默認值為System.DBNull ,因此它似乎試圖將一個空值寫入System.DBNull ,這對於Enum無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM