control changed change c# winforms user-controls picturebox

control - location changed c#



Muestra un número de usercontrol basado en el número de registros en la base de datos (2)

. La caja negra es un control de usuario.

Código de control de usuario

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(); } } } }

Código de formulario

public string ID { get { return textBox1.Text; } } private void textBox1_TextChanged(object sender, EventArgs e) { userControl21.ID = ID; userControl21.sample(); userControl21.getname(); }

Usando el código anterior, puedo mostrar un solo registro al control de usuario. ¿Cómo puedo mostrar un número de usercontrol basado en el número de registros en la base de datos con su imagen y nombre? Por ejemplo, tengo 7 registros en la base de datos, el formulario mostrará 7 controles de usuario. Y cuando hago clic o selecciono un control de usuario, se mostrará más información como Dirección, Contactos, etc. en mi formulario. Si los registros en la base de datos son demasiados para caber en el formulario, habrá una barra de desplazamiento vertical u horizontal. Dame un código :)

¿Cuál es el mejor contenedor para mostrar los controles de usuario que pueden tener barra de desplazamiento? un panel, cuadro de grupo o algo?

Esta debe ser la salida de muestra. .


En mi opinión, el mejor contenedor en su caso será FlowLayoutPanel con su propiedad FlowDirection establecida en FlowDirection.LeftToRight . Será especialmente útil ya que todos sus controles de usuario personalizados tienen el mismo tamaño (según lo que puedo ver en su segunda captura de pantalla). Y sobre su primera pregunta: podría crear su propio descendiente de FlowLayoutPanel y agregar algún método como LoadAllItemsFromDataBase, donde podría crear su control de usuario personalizado para cada registro como lo hace ahora y agregarlo dinámicamente a la colección de Controls de FlowLayoutPanel


Hemos creado una vista muy parecida a lo que describes. Tenemos una clase Container que se hereda de Form y se dibuja de manera personalizada (en realidad es una clase abstract la que heredamos para crear muchos tipos de contenedores que comparten una funcionalidad común). Agregamos estos Containers dinámicamente a un control de Panel basado en haber recorrido registros en una base de datos para recuperar información acerca de cómo se deben construir los Containers . Tener su propia clase significa que puede tener manejadores personalizados para cualquier evento que elija, como reaccionar a la selección del usuario (para obtener más información, como la dirección y los contactos).

En su ejemplo, no veo una clase para lo que usted llama "UserControl". Sugeriría comenzar allí. Una clase concreta que define un objeto "contenedor" es lo que delimitará este proyecto.

En su última captura de pantalla, el contorno rojo debe ser un control Panel . Panel permitirá el desplazamiento. Alternativamente, también podría usar FlowLayoutControl si prefiere que el control que posee sus contenedores controle el posicionamiento y el espaciado. Fuimos con un Panel para mantener el control sobre el posicionamiento absoluto.

Una vez que tiene una clase contenedora y un formulario con un Panel , puede recorrer los registros que recupera de su base de datos, agregar un objeto contenedor para cada uno y establecer sus valores simultáneamente (basado en el ejemplo, algunos textos y imagen).