我的小表单有一个dropbox,一个textBox,两个ComboBoxes和一个列表(供选择)。
代码没有错误,但是当我尝试保存表单并将数据存储在数据库中时,我得到了这个:
System.InvalidCastException:'无法转换类型的对象 键入'Windows.UI.Xaml.Controls.ComboBoxItem' 'System.IConvertible''。
+ $exception {System.InvalidCastException: Unable to cast object of type 'Windows.UI.Xaml.Controls.ComboBoxItem' to type 'System.IConvertible'.
at System.Convert.ToInt32(Object value)
以下是代码:
Db_Helper.InsertData(new
Data((Convert.ToString(listBox1.SelectedItem)),
(Convert.ToString(SelectedProductName.Text.Trim())),
(Convert.ToInt32(TextBox1.Text)),
//error below
(Convert.ToInt32(ComboBox1.SelectedItem)),
(Convert.ToString(ComboBox2.SelectedItem))));
我认为问题出在ComboBox1
转换。
答案 0 :(得分:0)
您错误地进行了转换。 'Windows.UI.Xaml.Controls.ComboBoxItem'
是Object
中常见的CLR .NET
。每个对象都带有可重载的.ToString()
方法,因此无论何时需要任何对象或其子类的默认字符串表示,您都应该调用myObject.ToString()
。
同样适用于ToInt32(...)
。继续.int.Parse/TryParse
以从字符串中获取强类型整数。当你这样做时,你至少会得到一个更明确的错误。
答案 1 :(得分:0)
SelectedItem
属性为您提供ComboBoxItem
。您想要的只是值,因此请改用SelectedValue
属性。
您希望将值转换为整数,但Convert.ToInt32()
采用字符串,而SelectedValue
属性为object
。您可以使用.ToString()
将其转换为字符串。
也不要将字符串值(如SelectedProductName.Text
)转换为字符串,这是多余的。
Db_Helper.InsertData(new
Data(listBox1.SelectedValue.ToString(),
SelectedProductName.Text.Trim(),
Convert.ToInt32(TextBox1.Text),
Convert.ToInt32(ComboBox1.SelectedValue.ToString()),
ComboBox2.SelectedValue.ToString());
编辑您需要使用ComboBox
和ListBox
属性正确绑定DisplayMemberPath
es和SelectedValuePath
。第一个将显示项目的文本,第二个将存储项目的ID。然后,您可以使用上面代码中的SelectedValue
属性获取ID。
以下是如何将ComboBox
绑定到按字母顺序排序的蔬菜列表的示例:
var data = new Dictionary<int, string>{
{100, "Eggplant"},
{102, "Onion"},
{300, "Potato"},
{105, "Tomato"},
{200, "Zuccini"}
};
ComboBox1.ItemsSource = data;
ComboBox1.DisplayMemberPath = "Value";
ComboBox1.SelectedValuePath = "Key";
XAML中的ComboBox1
必须没有项目。如您所见,我将DisplayMemberPath
绑定到Value
的{{1}},将Dictionary
绑定到SelectedValuePath
。您可以将任何所需的值用于ID,并且它们不必像索引那样是顺序的。这样,如果您以后添加新项目,则当前项目的ID不会更改。假设您想按字母顺序添加Garlic:
Key
如果您对var data = new Dictionary<int,string>{
{100, "Eggplant"},
{302, "Garlic"},
{102, "Onion"},
{300, "Potato"},
{105, "Tomato"},
{200, "Zuccini"}
};
使用int
,则无需像在代码中那样进行转换,只需使用直接转换即可。同样,对于Key
和listBox1
,您可以ComboBox2
使用string
,如果您愿意,也不需要转换:
Key
如果您希望将项目保留在XAML中而不是代码隐藏中,则不会与Db_Helper.InsertData(new
Data((string)listBox1.SelectedValue,
SelectedProductName.Text.Trim(),
Convert.ToInt32(TextBox1.Text),
(int)ComboBox1.SelectedValue),
(string)ComboBox2.SelectedValue);
属性等效,但您可以使用SelectedValuePath
属性对其进行模拟,如下所示:
Tag
答案 2 :(得分:0)
我认为你的转换语法是错误的转换为字符串我们在语句末尾使用toString方法,如下所示。
ComboBox2.SelectedItem.toString();
我希望这会帮助你
答案 3 :(得分:0)
或者代替SelectedItem使用下面的组合框的Text属性
ComboBox2.Text
并且您不必将其转换为字符串,它始终返回字符串
我希望这会帮助你
答案 4 :(得分:0)
我自己得到了解决方案。 错误的确在这一行:
(Convert.ToInt32(ComboBox1.SelectedItem)),
我不得不修改它有点像这样:
(int.Parse(ComboBox1.SelectedIndex.ToString())),
在我改变之前我遇到了错误
的SelectedItem
到
的SelectedIndex
。程序现在运行良好,我可以从ComboBox中提取所选数据。