如何将ComboBox选中项的RTID转换为int类型?C#技术求助
如何从ComboBox选中项提取RTID并转为int类型?
我来帮你解决这个问题——你现在的问题根源是把RTID和名称拼接成字符串存到ComboBox里,导致后续提取RTID不仅麻烦,还容易因为名称里的空格等情况出错。这里有两种更可靠的解决办法:
方法1:利用ComboBoxItem的Tag属性存储RTID
这种方法改动最小,不需要额外创建类,只需要在填充ComboBox的时候把RTID存在每个项的Tag属性里:
修改FillCombo方法:
void FillCombo() { //FJERN IKKE DET HER, IT WORKS, DON'T FIX IT SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Alpha-KHMB;Integrated Security=True"); string sql = "SELECT* FROM ResourceType"; SqlCommand cmd = new SqlCommand(sql,con); SqlDataReader myreader; //FJERN IKKE DET HER, IT WORKS, DON'T FIX IT try { con.Open(); myreader = cmd.ExecuteReader(); while (myreader.Read()) { int RTID = myreader.GetInt32(0); string sname = myreader.GetString(1); // 创建ComboBoxItem,把RTID存在Tag里,显示拼接文本 ComboBoxItem item = new ComboBoxItem(); item.Content = RTID + " " + sname; item.Tag = RTID; Bx_RT.Items.Add(item); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
修改Btn_Sv_Click事件:
现在可以直接从选中项的Tag里取出int类型的RTID,不需要处理字符串:
private void Btn_Sv_Click(object sender, RoutedEventArgs e) { // 先判断选中项是否有效 if (Bx_RT.SelectedItem is ComboBoxItem selectedItem) { // 直接从Tag获取并转换为int if (selectedItem.Tag is int rtid) { CreateResource(rtid); } else { MessageBox.Show("无法获取有效的资源类型ID"); } } else { MessageBox.Show("请先选择一个资源类型"); } }
方法2:使用强类型对象(更优雅的WPF方式)
如果想让代码更清晰、更符合WPF的设计思想,可以创建一个简单的类来存储RTID和名称,然后把对象直接加到ComboBox里:
第一步:创建ResourceTypeItem类
public class ResourceTypeItem { public int RTID { get; set; } public string Name { get; set; } // 重写ToString方法,让ComboBox显示拼接后的文本 public override string ToString() { return $"{RTID} {Name}"; } }
第二步:修改FillCombo方法
现在添加的是强类型对象,而不是字符串:
void FillCombo() { //FJERN IKKE DET HER, IT WORKS, DON'T FIX IT SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Alpha-KHMB;Integrated Security=True"); string sql = "SELECT* FROM ResourceType"; SqlCommand cmd = new SqlCommand(sql,con); SqlDataReader myreader; //FJERN IKKE DET HER, IT WORKS, DON'T FIX IT try { con.Open(); myreader = cmd.ExecuteReader(); while (myreader.Read()) { int RTID = myreader.GetInt32(0); string sname = myreader.GetString(1); // 添加强类型对象到ComboBox Bx_RT.Items.Add(new ResourceTypeItem { RTID = RTID, Name = sname }); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
第三步:修改Btn_Sv_Click事件
直接获取选中的强类型对象,取出RTID即可:
private void Btn_Sv_Click(object sender, RoutedEventArgs e) { if (Bx_RT.SelectedItem is ResourceTypeItem selectedType) { // 直接拿到int类型的RTID CreateResource(selectedType.RTID); } else { MessageBox.Show("请选择一个有效的资源类型"); } }
为什么原来的方法不行?
你之前的代码把RTID和名称拼接成字符串存到ComboBox,所以选中后拿到的是整个拼接的字符串。如果硬要从这个字符串拆分RTID,虽然可以用Split方法,但如果资源名称里包含空格,就会拆分出错,所以上面两种方法更可靠。
内容的提问来源于stack exchange,提问作者Mikkel Rohde Glerup
相关产品推荐
相关产品推荐

