2016-06-13 4 views
0

В моем приложении Windows Forms Я пытаюсь заполнить список со значениями из набора данных, но он просто остается пустым и не дает никаких исключений.Использование набора данных для заполнения списка

Это мой код

 private void FormTeams_load(object sender, EventArgs e) 
    { 

     try 
     { 

      DBTeams = new DBConnection(); 
      conString = Properties.Settings.Default.UserConnectionString; 
      DBTeams.connection_string = conString; 

      DBTeams.Sql = Properties.Settings.Default.SQL_Teams; 

      ds = DBTeams.GetConnection; 

      MaxRows = ds.Tables[0].Rows.Count; 

      lsb_TeamsTeams.DataSource = ds; 
      lsb_TeamsTeams.DisplayMember = "team_name"; 
      lsb_TeamsTeams.ValueMember = "team_ID"; 

     } 
     catch (Exception err) 
     { 

      MessageBox.Show(err.Message); 

     } 

    } 

имя Listbox является "lsb_TeamsTeams", имя набора данных "DS". Таблица содержит 3 столбца. Я хочу, чтобы в этом ListBox отображались столбец «team_ID» и «team_name».

Хорошо, просто чтобы проверить, будет ли мой запрос отображаться в моей первой форме Form1, я попробовал следующее. Здесь я пытаюсь заполнить второй набор данных своей второй таблицей в базе данных, а затем попытаюсь передать данные в ListBox.

 private void Form1_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      secondForm = new FormTeams(); 

      DBPlayers = new DBConnection(); 
      conString = Properties.Settings.Default.UserConnectionString; 
      DBPlayers.connection_string = conString; 

      DBPlayers.Sql = Properties.Settings.Default.SQL_Players; 
      ds = DBPlayers.GetConnection; 

      DBPlayers.Sql = Properties.Settings.Default.SQL_Teams; 
      ds2 = DBPlayer.GetConnection; 

      lsb_Teams.DisplayMember = "team_name"; 
      lsb_Teams.ValueMember = "team_ID"; 
      lsb_Teams.DataSource = ds2; 


      MaxRows = ds.Tables[0].Rows.Count; 

      NavigateRecords(); 

      btn_Save.Enabled = false; 
      btn_New.Enabled = true; 
      btn_Cancel.Enabled = false; 

     } 
     catch (Exception err) 
     { 

      MessageBox.Show(err.Message); 

     } 
    } 

К сожалению, эта ошибка: Invalid object name 'tbl_Teams'.

Я не совсем понимаю, почему это поднимет эту ошибку, я попытался найти проблему в Google, но я мог только найти некоторые комментарии об обновлении кеша intellisense. Я попытался найти это в Visual Studio 2015 Enterprise, но не смог.

Здесь используются методы подключения к базе данных.

 public System.Data.DataSet GetConnection 
    { 

     get { return MyDataSet(); } 

    } 

    private System.Data.DataSet MyDataSet() 
    { 

     System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(strCon); 
     con.Open(); 
     da_0 = new System.Data.SqlClient.SqlDataAdapter(sql_string, con); 
     System.Data.DataSet dat_set = new System.Data.DataSet(); 
     da_0.Fill(dat_set, "Table_Data_1"); 

     con.Close(); 

     return dat_set; 

    } 

Так при попытке получить доступ к базе данных с помощью SQL Server Management Studio, я узнал, что таблица я создал в Visual Studio, не присутствует в базе данных, которая объясняет, почему я получил ошибку Invalid object name 'table' Как это может быть ? Я считаю, что это связано с тем, что я создал вторую таблицу через Visual Studio. Как-то это добавило его в проводник сервера Visual Studio, но не в фактическую базу данных. При использовании студии управления SQL мне удалось создать вторую таблицу, и тогда мой запрос на C# будет работать.

Но теперь появилась следующая проблема с заполнением ListBox.

Я не могу отобразить данные в своем ListBox, но я могу отображать данные в DataGridView, но я хотел бы отображать их в ListBox.

Мой код:

 private void Form1_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      secondForm = new FormTeams(); 

      DBPlayers = new DBConnection(); 
      conString = Properties.Settings.Default.UserConnectionString; 
      DBPlayers.connection_string = conString; 

      DBPlayers.Sql = Properties.Settings.Default.SQL_Players; 
      ds = DBPlayers.GetConnection; 

      DBPlayers.Sql = Properties.Settings.Default.SQL_Teams; 
      ds2 = DBPlayers.GetConnection; 

      //The following lines of code diplay: " System.Data.DataViewManagerList Item TypeDescriptor " in the ListBox. 
      lsb_Teams.DisplayMember = "team_name"; 
      lsb_Teams.ValueMember = "team_ID"; 
      lsb_Teams.DataSource = ds2.Tables[0]; 

      //This works, it displays the data from the table. 
      dataGridView1.DataSource = ds2.Tables[0]; 


      MaxRows = ds.Tables[0].Rows.Count; 

      NavigateRecords(); 

      btn_Save.Enabled = false; 
      btn_New.Enabled = true; 
      btn_Cancel.Enabled = false; 

     } 
     catch (Exception err) 
     { 

      MessageBox.Show(err.Message); 

     } 
    } 

Я попробовал несколько позиций линии .DataSource, но это не помогло. Я также попытался поместить данные из другого набора dataset dataset [0] в ListBox, а затем отображает данные из столбца DisplayMember, но выдает ошибку при запуске приложения cannot bind to the new value member. Parameter name: value.

ответ

0

Вы можете использовать:

lsb_TeamsTeams.DataSource = ds.Tables[0]; 

и Проверьте ds.Tables[0] содержит данные.

вы должны также изменить второй запрос DBPlayers.Sql, чтобы получить данные из tbl_Teams таблицы:

DBPlayers.Sql = Properties.Settings.Default.SQL_Players; 
ds2 = DBPlayer.GetConnection; 

потому, что вы используете один и тот же запрос игроков, чтобы заполнить Seconde DataSet

+0

Вспомните, что я уже пробовал этот. Остается пустым. Но спасибо. – Dennis1679

+0

Каково значение 'MaxRows', вы уверены, что у вас есть данные в' ds.Tables [0] '? –

+0

MaxRows устанавливается на количество строк в таблице [0]. В этом случае 2. Но это не очень важно, так как я повторно использовал этот код из другой части моего приложения, и сейчас я даже не использую MaxRows (пока). – Dennis1679

1

Проверьте, если таблицы набора данных являются (с использованием разрывов кода). Вам нужно использовать DataAdapter для заполнения набора данных, и я не думаю, что вы это делаете.Кроме того, отправьте свой SQL-запрос, если это вам не поможет.

+1

Спасибо! Этот кодовый слом очень полезен. Я узнал, что мой запрос даже не работает. В Form1, моей основной форме, я использую тот же код и запускаю запрос 'SELECT * FROM tbl_Players'. Это работает как шарм. Но когда я пытаюсь повторно использовать этот код и пытаюсь заполнить второй набор данных с помощью этого запроса, визуальная студия SELECT * FROM tbl_Teams визуализирует ошибку 'Invalid object name 'tbl_Teams'. – Dennis1679

+1

Вы не можете загружать данные из двух наборов данных в один список. Кроме того, вы не сможете показывать более двух столбцов в списке (если вы не используете конкатенацию для объединения двух полей). Я бы предложил использовать listview в режиме сетки, чтобы иметь несколько столбцов. Кроме того, я бы пересмотрел инструкцию SQL, чтобы сделать JOIN в двух таблицах, и использовать полученный набор данных для заполнения списка. –

+0

Я не пытаюсь это сделать. Первый набор данных, который я использую для отображения отдельных записей в текстовом поле, и я хочу, чтобы в моем списке отображалось только 2 столбца, так что это не проблема. Если я выполняю оператор Join, то как мне отфильтровать результаты, которые мне нужны для моего ListBox? – Dennis1679

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