无法将ComboBoxItem强制转换为String或Int

时间:2018-01-28 08:06:56

标签: c# string combobox casting type-conversion

我的小表单有一个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转换。

5 个答案:

答案 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());

编辑您需要使用ComboBoxListBox属性正确绑定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,则无需像在代码中那样进行转换,只需使用直接转换即可。同样,对于KeylistBox1,您可以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中提取所选数据。