[英]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,但是即使我在調試模式下進行了糾正,它仍然會給我同樣的異常。
從數據源返回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);
DataSourceNullValue
指定將數據源的哪個值視為空值,還指定對於空值應將哪個值寫回到數據源 。
默認值為System.DBNull
,因此它似乎試圖將一個空值寫入System.DBNull
,這對於Enum無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.