2015-05-17 77 views
0

我有一个表格,允许用户通过输入玩家名称并从组合框中选择玩家所属的分区来选择玩家。C#ComboBox SelectedItem.toString()不返回预期结果

当时间到来给玩家添加到我的TreeView控件,应该显示部门选择显示该文本而不是节点:System.Data.DataRowView

我的代码通过MSDN这里实现这一点:https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.selecteditem%28v=vs.110%29.aspx

下面是形式的负载功能的代码,以填补组合框:

 private void frm_add_players_Load(object sender, EventArgs e) 
    { 
     Divisions divs = new Divisions(); 
     Players players = new Players(); 
     DataTable dtDivisions = divs.GetActiveDivisions(); //divisions combo box 
     DataTable dtPlayers = players.GetPlayersByTourID(this.tourID); 
     //set the forms datatable 
     this.dt_players = dtPlayers; 

     //fill the combo box 
     this.cmbo_divisions.DataSource = dtDivisions; 
     this.cmbo_divisions.DisplayMember = "title"; 
     this.cmbo_divisions.ValueMember = "ID"; 
     this.cmbo_divisions.SelectedIndex = -1; 
     this.cmbo_divisions.Text = "Select a Division"; 

     //set treeview imagelist 
     this.tview_roster.ImageList = tview_imagelist; 
     this.tview_roster.ImageIndex = 1; //division icon 

     //fill treeview 
     foreach (DataRow dr in dtPlayers.Rows) 
     { 
      FillPlayerTreeview(dr); 
     } 

     //expand treeview 
     this.tview_roster.ExpandAll(); 
     this.ActiveControl = this.txt_player_name; 
    } 

这里我所说的功能给玩家添加到TreeView:

private void btn_add_Click(object sender, EventArgs e) 
    { 
     object selItem = cmbo_divisions.SelectedItem; 
     AddPlayerToTreeView(txt_player_name.Text, selItem.ToString()); 
    } 

这里是增加了玩家功能:

 private void AddPlayerToTreeView(string playerName, string division) 
    { 
     TreeNode[] tns = this.tview_roster.Nodes.Find(division, false); //try to find the division, if exists 
     TreeNode tn = new TreeNode(); 

     if (tns.Length > 0) //division exists - add player 
     { 
      tn = this.tview_roster.Nodes[tns[0].Index].Nodes.Add(playerName, playerName); 
      tn.ImageIndex = 0; //player icon 
     } 
     else //division doesn't exist - add division, then add player 
     { 
      tn = this.tview_roster.Nodes.Add(division, division); 
      tn.ImageIndex = 1; //division icon 
      AddPlayerToTreeView(playerName, division); 
     } 
    } 

,结果是这样的: cmbobox issue

我不知道为什么它不会工作..我不知所措。任何帮助,将不胜感激。

+0

您的组合框定义在哪里?显然,它不会通过调用'.ToString()'来显示数据。你也不应该那样做。 – nvoigt

+0

我通过MSDN获得了此解决方案:https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.selecteditem%28v=vs.110%29.aspx – wribit

+0

您应该将代码添加到你用数据填充Combobox,它会简化它,帮助我们。 – Ian

回答

1

嗯,好吧......也许像下面这样。

访问组合的数据源,它是一个DataTable,并使用选定的索引提取选定的行和列值。也许增加一些错误处理。

private void btn_add_Click(object sender, EventArgs e) 
{ 
    var data = cmbo_divisions.DataSource as DataTable; 
    var row = data.Rows[cmbo_divisions.SelectedIndex]; 
    var selected = row["title"].ToString(); 
    AddPlayerToTreeView(txt_player_name.Text, selected); 
} 
+0

这个作品!我多么希望我会想到:)谢谢! – wribit

0

尝试:

private void btn_add_Click(object sender, EventArgs e) 
{ 
    AddPlayerToTreeView(txt_player_name.Text, cmbo_divisions.Items[cmbo_divisions.SelectedIndex].Text); 
} 

编辑:更新更好的方式

+0

不幸的是,我得到了同样的结果... – wribit

+0

@wribit也许我编辑得太快以至于无法从代码中复制和粘贴错误,但是现在我重写了它而没有复制。这应该工作。 –

+0

对不起...再次,我得到相同的结果 – wribit

0

试试这个:

private void btn_add_Click(object sender, EventArgs e) 
{ 
    object selItem = cmbo_divisions.SelectedItem; 
    AddPlayerToTreeView(txt_player_name.Text, cmbo_divisions.SelectedItem as string); 
} 

的ToString()将获得的类型名称,但在这种情况下的SelectedItem是一个字符串。