Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
highlevel:csharp:apps [2008/12/28 10:29] alfred |
highlevel:csharp:apps [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 227: | Línea 227: | ||
| * AcceptsReturn y AcceptsTab (bools) Si un textbox (multiline) acepta enter y tab. | * AcceptsReturn y AcceptsTab (bools) Si un textbox (multiline) acepta enter y tab. | ||
| Para que un string con ''\n'' puede introducirse en un textbox multiline no sólo ha de ser ''\n'' sino también ''\r\n''. sabes? | Para que un string con ''\n'' puede introducirse en un textbox multiline no sólo ha de ser ''\n'' sino también ''\r\n''. sabes? | ||
| + | |||
| Línea 261: | Línea 262: | ||
| </code> | </code> | ||
| Los ''Bounds'' son los límites del elemento que se va a dibujar | Los ''Bounds'' son los límites del elemento que se va a dibujar | ||
| + | === Acceder a los seleccionados en un listBox mediante el Mouse === | ||
| + | En el evento mousedown de un listbox: | ||
| + | * Declaramos un listBox auxiliar, para ello cogemos el parámetro “sender” que es un object y lo podemos convertir a listbox: | ||
| + | <code csharp> | ||
| + | ListBox lb = ((ListBox)sender); | ||
| + | </code> | ||
| + | * Declaramos un nuevo Point, a este le pasamos como parámetros las coordenadas X e Y del clic, las sacaríamos del parámetro ‘e’, que es un ''MouseEventArgs''. | ||
| + | * Cogemos el índice según el punto de clic mediante el método IndexFromPoint del listbox que se le ha de pasar un objeto Point, si el integer devuelto es menor de 0 es que no es un elemento de la lista: | ||
| + | <code csharp> | ||
| + | int idx = lb.IndexFromPoint (VarPoint); | ||
| + | </code> | ||
| ==== ComboBox ==== | ==== ComboBox ==== | ||
| Línea 403: | Línea 414: | ||
| } | } | ||
| </code> | </code> | ||
| + | |||
| Línea 410: | Línea 422: | ||
| === Cursor === | === Cursor === | ||
| Representa el cursor que se muestra. Por ejemplo, si queremos cambiar el cursor un momento mientras se ejecuta una rutina, guardaríamos el cursor actual en un objeto cursor, luego el ‘Cursor.Current’ lo cambiamos por el elemento deseado de la enumeración Cursors y al acabar a ‘Cursor.Current’ le asignamos el que habíamos guardado. | Representa el cursor que se muestra. Por ejemplo, si queremos cambiar el cursor un momento mientras se ejecuta una rutina, guardaríamos el cursor actual en un objeto cursor, luego el ‘Cursor.Current’ lo cambiamos por el elemento deseado de la enumeración Cursors y al acabar a ‘Cursor.Current’ le asignamos el que habíamos guardado. | ||
| + | === HelpProvider === | ||
| + | Es una clase que encontramos en System.Windows.Forms, es un extensor de propiedades que, al colocarse en un contenedor nos permite que al estar sobre un control y clicar F1 nos aparezca un pequeño pop-up donde nos muestra un texto introducido en la Propiedad añadida HelpEstring. | ||
| + | |||
| ===== Acceso a datos ===== | ===== Acceso a datos ===== | ||
| Línea 415: | Línea 430: | ||
| + | |||
| + | |||
| + | ==== ADO.NET ==== | ||
| + | Es el conjunto de clases dentro del framework .NET enfocado al acceso a datos. Se divide en dos tipos de clases, las que sirven para acceder a los datos (DataProvider) y las que sirven para leer\manipular dichos datos (DataSet). \\ \\ | ||
| + | Todas estas clases se encuentran en ''System.Data''. | ||
| + | |||
| + | === Clases === | ||
| + | Clases de acceso datos según el proveedor (**DataProvider**), es decir SQLServer, Oracle... | ||
| + | * ''Connection'', clases que representan la conexión con la fuente de datos. | ||
| + | * ''Command'', sus objetos son necesarios para realizar acciones (lectura, modificación...) sobre la fuente de datos. | ||
| + | * ''Parameter'', los parámetros que se le pasan al objeto Command. | ||
| + | * ''DataAdapter'', conecta la DB con el DataSet. | ||
| + | * ''DataReader'', controla el acceso a los registros. | ||
| + | La clase DataSet representa un esquema de la fuente de datos (la estructura de la parte de la DB a la que se accede), conteniendo tablas, relaciones... Los objetos relacionados con un DataSet son: | ||
| + | * ''DataTable'', tabla de la base de datos. | ||
| + | * ''DataView'', representa la forma de ver los datos (sotre este se lanzan las clausulas "ORDER BY", "WHERE"...) | ||
| + | * ''DataColumn'', representa una columna de la tabla, con su nombre y su tipo. | ||
| + | * ''DataRow'', representa una fila de la tabla, nos permite leer y modificar los valores. | ||
| + | * ''DataRelation'', es una relación entre tables (clave primaria \ clave foranea). | ||
| + | * ''Constraint'', describe una propiedad de la base de datos que se debe cumplir (valores únicos, no nulos...). | ||
| + | |||
| + | Los ''DataSet'' se llenan a partir de los datos de una DB mediante un ''DataAdapter'' configurado a partir de un objeto ''Connection'' y otro ''Command'' (y este a su vez configurado mediante objetos ''Parameter''). \\ \\ | ||
| + | Ver ejemplos [[highlevel:csharp:snippets#trabajar_con_fuentes_de_datos|aquí]]. | ||
| + | |||
| + | === Cómo hacer una petición a BD? === | ||
| + | Para acceder a una DB MSSQLServer (por ejemplo) necesitaremos utilizar las clases que están dentro del namespace ''System.Data.SqlClient'' siguiendo los siguientes pasos: | ||
| + | - Crear conexión, inicializando un objeto ''SqlConnection'' a partir de una ''ConnectionString''. | ||
| + | - Abrir la conexión llamando al método ''Open'' del ''SqlConnection''. | ||
| + | - Crear un objeto ''SqlCommand'', que será el que contenga la consulta a realizar sobre la DB. Se le ha de pasar la conexión. | ||
| + | - Ejecutar el ''SqlCommand'': | ||
| + | - Mediante el método ''ExecuteReader''. Que devuelve un ''DataReader'' del cual se podrán ir recogiendo los valores mientras el método ''Read'' devuelva ''true''. | ||
| + | - Mediante el método ''ExecuteNonQuery''. Que devuelve el número de filas afectadas, para consultas que no sean //selects// sino //inserts//, //updates//... | ||
| + | <code csharp> | ||
| + | SqlConnection con = new SqlConnection(@"Data Source=VALLIRANA\ALSQLEXP;Initial Catalog=prueba;Integrated Security=True"); | ||
| + | con.Open(); | ||
| + | SqlCommand cmd = new SqlCommand("select * from personas", con); | ||
| + | SqlDataReader dr = cmd.ExecuteReader(); | ||
| + | while (dr.Read()) | ||
| + | Console.WriteLine("Nombre: {0}", String.Format(dr.GetValue(0).ToString())); | ||
| + | </code> | ||
| + | === Trabajar con Interfaces === | ||
| + | Las clases que envuelven la conexión a datos heredan de diversas interfaces las cuales nos pueden permitir realizar las consultas de forma global, independientemente del motor de base de datos. Algunas de estas interfaces son: ''IDbConnection'', ''IDbCommand'' o ''IDataReader''. Por ejemplo las utilizaríamos así: | ||
| + | <code csharp> | ||
| + | IDbConnection connection = new SqliteConnection(connectionString); // Aquí podríamos haber creado un OracleClient | ||
| + | connection.Open(); | ||
| + | IDbCommand cmd = this.connection.CreateCommand(); | ||
| + | cmd.CommandText = query; | ||
| + | this.reader = cmd.ExecuteReader(); // O ExecuteNonQuery si no es un Select | ||
| + | while (reader.Read()) | ||
| + | { ... } | ||
| + | reader.Close(); | ||
| + | connection.Close(); | ||
| + | </code> | ||
| + | |||
| + | ==== DataBinding ==== | ||
| + | Es la capacidad de enlazar automáticamente campos de un formulario con los datos que provienen de una DB. \\ | ||
| + | El ejemplo más sencillo es el de un TextBox denominado ''txtBox'', para asignarle el campo ''FirstName'' de la tabla ''Customers'' que es del tipo "Text" y lo encontramos en el ''DataSet'' denominado ''dsCust''. | ||
| + | <code csharp> | ||
| + | txtBox.DataBindings.Add("Text",dsCust,"Customers.FirstName"); | ||
| + | </code> | ||
| + | Para coger la posición actual utilizaremos la clase ''CurrencyManager'': | ||
| + | <code csharp> | ||
| + | CurrencyManager cm = (CurrencyManager)this.BindingContext[dsCust,"Customers"]; | ||
| + | long rowPosition = (long)cm.Position; | ||
| + | </code> | ||
| ==== Sobre SQL y ADO.NET ==== | ==== Sobre SQL y ADO.NET ==== | ||
| Línea 946: | Línea 1026: | ||
| } | } | ||
| </code> | </code> | ||
| + | |||
| ==== Otros ==== | ==== Otros ==== | ||
| Línea 965: | Línea 1046: | ||
| <control>.PointToScreen(<point>) | <control>.PointToScreen(<point>) | ||
| </code> | </code> | ||
| + | ===== Notas ===== | ||
| + | |||
| + | |||
| + | ==== Aplicaciones Windows multithread ==== | ||
| + | A partir de la versión 2005 acceder a un control desde un thread distinto al que se creó se controla los errores de concurrencia que se puedan producir, las distintas soluciones pueden ser: | ||
| + | * Poner la propiedad estática ''CheckForIllegalCrossThreadCalls'' de la clase ''Control'' a false. Esta es la solución más guarra, ya que el error puede seguir produciendose. | ||
| + | * Usando un objeto **BackgroundWorker**. Esta clase se encarga de realizar una tarea en segundo plano, para utilizar un objeto de esta se le indicará el método que se desea realizar en segundo plano y luego llamar al método ''RunWorkerAsync'' del BackgroundWorker. Cuando acaba la tarea llama al evento ''RunWorkerCompleted''. | ||
| + | * Utilizando el método ''Invoke'' del control. | ||
| + | - Preguntamos la propiedad del control ''InvokeRequired''. | ||
| + | - Si está a ''true'' llamaremos a ''Invoke'' con un delegado que hace la llamada al control. | ||
| + | - Si está a ''false'' accederemos al control directamente. | ||