Herramientas de usuario

Herramientas del sitio


highlevel:csharp:apps

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
highlevel:csharp:apps [2008/12/28 09:43]
alfred
highlevel:csharp:apps [2020/05/09 09:25] (actual)
Línea 36: Línea 36:
 </​code>​ </​code>​
 Tenemos las siguientes: ''​AssemblyTitle,​ AsseblyDescription,​ AssemblyConfiguration,​ AssemblyCompany,​ AssemblyProduct,​ AssemblyCopyright,​ AssembyTrademark,​ AssemblyCulture''​ (Que especifica el lenguaje y el país del archivo. Peeero no se puede poner en un ejecutable. Para encontrar las siglas que corresponden al país que queramos las encontraremos en: www.ietf.org/​rfc),​ ''​AssemblyVersion''​ (La versión que es una cifra compuesta de cuatro números separados por puntos 1.0.0.0 (version principal . v secundaria . revision . compilación). Podemos indicar que c# las introduzca automáticamente añadiendo un asterisco en el número de compilación (sólo para que introduzca la compilación) o en la revisión (y añadirá la compilación y la revisión): 1.0.*). Tenemos las siguientes: ''​AssemblyTitle,​ AsseblyDescription,​ AssemblyConfiguration,​ AssemblyCompany,​ AssemblyProduct,​ AssemblyCopyright,​ AssembyTrademark,​ AssemblyCulture''​ (Que especifica el lenguaje y el país del archivo. Peeero no se puede poner en un ejecutable. Para encontrar las siglas que corresponden al país que queramos las encontraremos en: www.ietf.org/​rfc),​ ''​AssemblyVersion''​ (La versión que es una cifra compuesta de cuatro números separados por puntos 1.0.0.0 (version principal . v secundaria . revision . compilación). Podemos indicar que c# las introduzca automáticamente añadiendo un asterisco en el número de compilación (sólo para que introduzca la compilación) o en la revisión (y añadirá la compilación y la revisión): 1.0.*).
 +
  
 ==== Objeto Application ==== ==== Objeto Application ====
Línea 69: Línea 70:
     * RemoveMessageFilter     * RemoveMessageFilter
     * Run: Inicia el bucle de mensajes de windows... Si se le indica un formulario, inicia, en este, la aplicación.     * Run: Inicia el bucle de mensajes de windows... Si se le indica un formulario, inicia, en este, la aplicación.
- + 
 +**ApplicationContext** es una clase que se nos permite pasarla al método ''​Application.Run''​ para iniciar una aplicación,​ de esa forma no es necesario un formulario. La aplicación no acabará hasta que no se llame al método ''​ExitThread''​. 
 + 
 + 
 ==== Código generado por el editor de formularios ==== ==== Código generado por el editor de formularios ====
 La estructura de lo que genera es muy similar al primer ejemplo de programa: La estructura de lo que genera es muy similar al primer ejemplo de programa:
Línea 222: 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 256: 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 398: Línea 414:
 } }
 </​code>​ </​code>​
 +
  
  
Línea 405: 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 410: 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 941: Línea 1026:
 } }
 </​code>​ </​code>​
 +
  
 ==== Otros ==== ==== Otros ====
Línea 960: 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.
highlevel/csharp/apps.1230457417.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)