2013-06-03 2 views
0

Valid XHTML. Черный ящик - это usercontrol.Показать номер usercontrol на основе количества записей в базе данных

UserControl Код

string b = ""; 
    public string ID 
    { 
     set { b = value; } 
    } 

    public void sample() 
    { 
     textBox1.Clear(); 
     using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.ConnectionString)) 
     { 
      myDatabaseConnection.Open(); 
      using (SqlCommand SqlCommand = new SqlCommand("Select LastName, Image from Employee where ID = @a", myDatabaseConnection)) 
      { 
       SqlCommand.Parameters.AddWithValue("@a", b); 
       DataSet DS = new DataSet(); 
       SqlDataAdapter da = new SqlDataAdapter(SqlCommand); 
       da.Fill(DS, "Images"); 
       var imagesTable = DS.Tables["Images"]; 
       var imagesRows = imagesTable.Rows; 
       var count = imagesRows.Count; 

       if (count <= 0) 
        return; 
       var imageColumnValue = 
        imagesRows[count - 1]["Image"]; 
       if (imageColumnValue == DBNull.Value) 
        return; 

       var data = (Byte[])imageColumnValue; 
       using (var stream = new MemoryStream(data)) 
       { 
        pictureBox1.Image = Image.FromStream(stream); 
       } 

      } 
     } 
    } 

    public void getname() 
    { 
     using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.ConnectionString)) 
     { 
      myDatabaseConnection.Open(); 
      using (SqlCommand SqlCommand = new SqlCommand("Select LastName from Employee where ID = @a", myDatabaseConnection)) 
      using (SqlDataAdapter da = new SqlDataAdapter(SqlCommand)) 
      { 
       SqlCommand.Parameters.AddWithValue("@a", b); 

       SqlDataReader DR1 = SqlCommand.ExecuteReader(); 
       if (DR1.Read()) 
       { 
        textBox1.Text = DR1.GetString(DR1.GetOrdinal("LastName")).ToString(); 
       } 
      } 
     } 
    } 

Форма Код

public string ID 
    { 
     get { return textBox1.Text; } 
    } 

     private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     userControl21.ID = ID; 
     userControl21.sample(); 
     userControl21.getname(); 
    } 

Используя код выше, я могу показать одну запись в UserControl. Как я могу отобразить несколько usercontrol на основе количества записей в базе данных с их изображением и именем? Например, у меня есть 7 записей в базе данных, в форме будет отображаться 7 пользовательских контролей. И когда я нажимаю или выбираю usercontrol, в моей форме будет отображаться дополнительная информация, такая как Адрес, Контакты, Etc. Если записей в базе данных слишком много, чтобы вписаться в форму, будет вертикальная или горизонтальная полоса прокрутки. Дайте мне код :)

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

Это должен быть выход образца. Valid XHTML.

+0

[Добавить/удалить их динамически] (http://stackoverflow.com/questions/4719476/create-controls-dynamically) – Sayse

ответ

1

На мой взгляд лучшим контейнером в вашем случае будет FlowLayoutPanel с его FlowDirection объектов недвижимости FlowDirection.LeftToRight. Это будет особенно полезно, поскольку все ваши пользовательские элементы управления имеют одинаковый размер (из того, что я вижу на втором скриншоте). А по поводу первого вопроса: вы можете создать свой собственный потомок FlowLayoutPanel и добавить метод, как LoadAllItemsFromDataBase, где вы могли бы создать свой собственный пользовательский элемент управления для каждой записи, как вы делаете сейчас и добавить его динамически в Controls коллекции FlowLayoutPanel

0

У нас есть создал представление, очень похожее на то, что вы описываете. У нас есть класс Container, который унаследован от Form и выполнен на заказ (это фактически класс abstract, который мы дополнительно наследуем, чтобы создать множество типов контейнеров, все из которых имеют общую функциональность). Мы добавляем эти Containers динамически к элементу управления Panel, основанному на зацикливании записей в базе данных для получения информации о том, как должны быть построены Containers. Быть собственным классом означает, что вы можете иметь пользовательские обработчики для любого выбранного вами события, например, реагировать на выбор пользователя (для получения дополнительной информации, такой как адрес и контакты).

В вашем примере я не вижу класс для того, что вы называете «UserControl». Я предлагаю начать там. Конкретный класс, определяющий объект «контейнер», является тем, что будет привязывать этот проект.

В последнем скриншоте красный контур должен быть Panel. Panel позволит прокручивать. В качестве альтернативы вы также можете использовать FlowLayoutControl, если вы предпочитаете, чтобы элемент управления, который владеет вашими контейнерами, контролировал позиционирование и интервал. Мы пошли с Panel, чтобы сохранить контроль над абсолютным позиционированием.

Как только у вас есть класс контейнера и форма с Panel на нем, вы можете прокручивать записи, которые вы извлекаете из своей базы данных, добавляя контейнерный объект для каждого из них и одновременно устанавливая его значения (на основе примера, некоторый текст и изображение).