2015-10-18 2 views
0

Я пытаюсь создать адресную книгу с C# и базой данных MySQL. Я пытаюсь использовать метки и установить Text из Label с информацией о базе данных. Я использую FlowLayoutPanel для своих лейблов. Я получаю информацию только от 1 человека, я хочу, чтобы все люди в базе данных были указаны в результатах. Что я делаю не так?Итерация через MySQL Таблица

MySqlCommand cmd = cnn.CreateCommand(); 
cmd.CommandText = "SELECT first_name, last_name, street, city, state, zip, phone, email From address_book ORDER BY last_name, first_name"; 
try 
{ 
    cnn.Open(); 
    MySqlDataReader reader = cmd.ExecuteReader(); 
    while (reader.Read()) 
    { 
     lblFirstName.Text = reader.GetString("first_name") + " " + reader.GetString("last_name"); 
     lblStreet.Text = reader.GetString("street"); 
     lblCityStateZip.Text = reader.GetString("city") + ", " + reader.GetString("state") + " " + reader.GetString("zip"); 
     lblPhone.Text = reader.GetString("phone"); 
     lblEmail.Text = reader.GetString("email"); 
    }   
    cnn.Close(); 
} 
+1

У вас есть только один набор элементов интерфейса, и вы повторно пишете только один набор. Независимо от того, какую технологию пользовательского интерфейса вы используете, вам понадобится какой-то компонент ретранслятора или списка или сетки, который отображает * несколько * записей. Вы не можете отображать несколько записей только с одной меткой. – David

+0

yes @David правильно, вам нужен какой-либо ретранслятор или сетка для отображения на основе возвращаемых чисел строк из вашего запроса. –

+0

У вас может быть FlowLayoutPanel, но элементы управления, такие как 'lblFirstName', ничего не знают о том, в каком контейнере они находятся. –

ответ

0

Я понял, как написать код, который я хотел. Я использую label на FlowLayoutPanel для записи всех записей в таблице MySQL. Это не форма Windows Label из панели инструментов. Он будет записывать из базы данных в label, и flowLayoutPanel будет размещать каждый новый вывод один за другим в panel.

cnn.Open(); 
      MySqlDataReader reader = cmd.ExecuteReader(); 
      Label lblName; 
      while (reader.Read()) 
      { 

       lblName = new Label(); 
       lblName.Text = reader.GetString("first_name") + " " + reader.GetString("last_name") + " \r\n" 
       + reader.GetString("street") + " \r\n" 
       + reader.GetString("city") + ", " + reader.GetString("state") + " " + reader.GetString("zip") + " \r\n" 
       + reader.GetString("phone") + " \r\n" 
       + reader.GetString("email"); 
       lblName.Width = 200; 
       lblName.Height = 90; 
       flowLayoutPanel1.Controls.Add(lblName); 
      } 

      cnn.Close(); 
0

Вы просто можете увидеть последнюю найденную запись в этикетках, потому что каждый раз, когда следующий извлекаться запись перезаписать Label «ы Text в петле while. Если вы хотите показать все извлеченные записи, вы должны использовать DataGridView. Что-то вроде этого:

SqlDataAdapter da = new SqlDataAdapter("SELECT first_name, last_name, street, city, state, zip, phone, email From address_book ORDER BY last_name, first_name", con); 
DataSet ds = new DataSet(); 
da.Fill(ds); 
dataGridView1.DataSource = ds.Tables[0]; 
+0

Мне нужно больше информации о том, как это использовать. В Java с использованием метки в цикле хорошо работает, но я не понимаю, как это сделать в C#. SqlDataAdapter подчеркивается, и он говорит: «Тип или пространство имен« SqlDataAdapter »не удалось найти», а dataGridview1 подчеркнуто и говорит: «Имя dataGridView1 не существует в текущем контексте». –

+0

@DaleWahl ... Вы должны добавить 'DataGridView' из панели инструментов в свою форму. Также добавьте 'using System.Data.SqlClient;' к использованию директивы. –

+0

Я понял, как использовать метки в цикле, он очень похож на Java. Я работал DataGridView, но я не мог заставить его выглядеть так, как хочу. –

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