2015-05-17 2 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

Try с:

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

EDIT: Обновление для лучшего способа

+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 это строка.

Смежные вопросы