Empezando con C#.net

Buenas.

Una vez más recurro a vosotros, esta gran comunidad, para preguntaros acerca de C#.net.

Vereis, vengo de programar con Visual Basic .net y Visual Basic 6.0, y estoy intentando aprender a programar con C#.net, pero joder...me está costando realmente una BARBARIDAD, hacer auténticas polladas, como gestionar distintos formularios a través de un menuStrip en un formulario principal, activar/desactivar controles del formulario principal a través de formularios abiertos por las distintas opciones del menuStrip del formulario principal, etc...

Ando buscando algún tutorial, proyecto, ejemplo...no lo sé...lo que sea...para aprender estos conceptos básicos (joder, mira que es fácil en VB.net, y en Visual 6.0...pero con C# no tengo cojones...creo que es el lenguaje que más me está costando aprender... [+risas]), los únicos tutoriales que he encontrado hacen referencia a lo que es C# en sí, a su sintaxis, etc...pero lo que no encuentro es orientado a la programación en windows (vamos, los winforms, con sus controles y sus cositas), porque luego, lo que son los controles, sí que son muy parecidos por no decir igual su funcionamiento a los de vb.net, pero joder...esque me deprimo al ver que no soy capaz de controlar que al pulsar una opción del menuStrip se me abra un formulario nuevo, se me desactive el menuStrip, y al cerrar el formulario que se ha abierto, vuelva a activarse...y cosas así...

Como sé que muchos de los que están aquí se dedican laboralmente a ésto...pues a ver si podían echarme un cablecito. La verdad que se lo agradecería bastante...Yo podría a cambio echar una manu con VB 6.0, VB.net, C/C++, etc...

bueno, pues un saludo, y muchas gracias.
Es extraño que sabiendo VB.Net te esté costando C#. Todo lo que hacías en VB.Net se hace igual en C#, se puede decir que solo cambia la sintaxis, si no estoy equivocado.

¿Tienes algún fragmento de código en VB que no seas capaz de pasar a C#? O algo más concreto con lo que poder ayudarte...

En cualquier caso, te puedo recomendar un libro de un profesor de mi universidad (Alcalá de Henares) que es muy didáctico y está muy completo. Tiene varios, el que conozco y he utilizado yo es "Enciclopedia de Microsoft Visual C#, 2ª edición", tienes información de todos sus libros en su página web: http://www.fjceballos.es/publicaciones_cs.html

Seguro que otros foreros pueden recomendarte otros libros, yo este es el único que conozco :)

Suerte! Un saludo!
Creo que no es correcto este post en Software libre... :/ Creo que iría mejor en general.

Un saludo.
hola.

sagitario, pues la verdad es que estoy realizando un pequeño txt con lo que me está costando además de un ejemplo con código y tal, a ver si puedo subirlo pronto y le echas un vistazo. En verdad, lo que más trabajo me está costando son las tonterías de por ejemplo, tener un formulario primario, abrir a través de este un segundo formulario, y a través de este segundo, modificar controles, etc...del formulario primario, también el tema de los MDI y demás, pero vamos, creo que le voy cogiendo el tranquillo, no es tan dificil...y la verdad...es que me gusta muchísimo más que vb.net, no sé, yo siempre he sido más de c/c++, y la verdad es que me encanta todo, lo veo mucho más ordenado, estructurado y demás que vb.net, pero bueno, nunca está de más saber las dos cosas.

Ayer estuve haciendo conversión de códigos de acceso a bases de datos, etc...y de momento muy bien y un poco más motivado...que no veas que bajona me dio al ver que no era capaz ni de abrir dialogos secundarios jajaja.

Pues a ver si esta tarde/noche cuelgo la solución, y explico un poco las cosas que no sé hacer ok? y de paso, me echais un vistazo al código...a ver si estoy haciendo bien las cosas...que una de las cosas por las que más me preocupo es por hacer el código lo más eficiente/óptimo/documentado posible.

capitanquarz, pues reporto el post para qeu lo muevan a general, la verdad es que no sabía donde colocarlo, pues veo post de programación en todos lados.

un saludo.
yo no veo por qué no debería ir aquí, pues tan sencillo es liberar código en C# como en cualquier otro lenguaje. En cuanto a las diferencias entre VB.net y C#, las más fuertes que he encontrado no son por culpa del lenguaje, sino de Visual Studio, que es más "automático" para ciertas acciones en VB.net que en C#, y en algunos conceptos como el manejo de delegados, predicados, y manejo de eventos. Por lo demás, no hay mayor diferencia que la sintaxis, si tienes buena base de experiencia en uno, te manejas en otro en un par de días y en una semana los trabajas indistintamente (salvo porque acabas terminando las líneas en ; en VB y a pelo en C# xD).
yo puedo hechar alomejor una mano en temas concretos. Por cierto no se porque este hilo no puede ir en software libre. Se debe diferenciar bien que es software libre. No significa software gratuito, y con Visual studio se puede desarrollar aplicaciones libres. De hecho en mi empresa se ha hecho alguno, y programamos basicamente en C#
tualotuyo escribió:yo puedo hechar alomejor una mano en temas concretos. Por cierto no se porque este hilo no puede ir en software libre. Se debe diferenciar bien que es software libre. No significa software gratuito, y con Visual studio se puede desarrollar aplicaciones libres. De hecho en mi empresa se ha hecho alguno, y programamos basicamente en C#

Por ello no lo he reportado, ya que tiene tanto cabida en General como en Software libre, dependiendo únicamente de la licencia que le de al futuro programa.

No obstante, siendo las bibliotecas de C# privativas, y por encontrarse en un lenguaje que en cualquier momento podría cambiar la licencia de uso, pudiendo cambiar la licencia del programa, creo que es mejor (**en mi opinión**) en General, aunque también puede estar en este subforo.
iria mejor en un subforo de programación que hace mucha falta,al margen de eso C# es realmente muymuymuy similar a Java ,ideas copiadas + sintaxis casi exacta
minius escribió:iria mejor en un subforo de programación que hace mucha falta,al margen de eso C# es realmente muymuymuy similar a Java ,ideas copiadas + sintaxis casi exacta


El caso es que entre ellas se han alimentado mutuamente. porque C# tiene ideas de java, y java ideas de C#. Yo estuve trabajando un poco en java y lo poco que vi (lo que recuerdo ahora mas xD) es que para gestion de ficheros la cosa era mas enredada en java que en c#. Y la programacion web en uno y en otro.... bueno.

Pero este hilo no va de esto xD, perdonar.
POST EDITADO AL FINAL:

Buenas.

Pues he vuelto después de unos días desaparecido, pero he estado con mi novia y aprovechando un poquito el fin de semanita...que ya queda poco para la vuelta a la rutina [+risas].

Ante todo, gracias por las respuestas que habéis dejado.

Yo también estoy de acuerdo en que debería de haber un subforo de programación...la verdad es que SIEMPRE lo he visto necesario, pues aquí estamos bastantes programadores, tanto de profesión como de hobby, y bueno, es mejor tenerlo todo organizado cada cosa en su sitio.

Aquí os dejo el proyecto de aprendizaje que estoy haciendo poquito a poquito para ir aprendiendo c#.

La verdad es que, conforme más voy "mejorando" y tal, cada vez lo veo más claro y útil con respecto a vb.net, que tampoco difiere mucho, la verdad...pero hay alguna cosita que aún no me va quedando clara (chorradas y demás, seguro).

De momento he logrado conectar con una BBDD en SQLServer, y hacer las típicas operaciones (consultas, inserciones, etc...), y poquito a poquito voy haciendo más cositas.

Os explico un poco el "proyecto" (por llamarlo de alguna forma).

He hecho un formulario principal, que es el que contiene el menustrip con los menús a los distintos formularios ("ejercicios") que estoy realizando.

El primero de ellos es el de inserción en una base de datos (que posteriormente lo re-utilizo para editar los mismos registros a través de un datagrid) en este, de momento no tengo ninguna duda.

El segundo es un datagrid que carga a través de código (no he usado ningún origen de datos puesto que quiero realizar más adelante otras cosas con él) una serie de registros de una base de datos que está adjunta en el proyecto.

La idea es que en el primer formulario (el de inserción de datos), insertes un nombre, apellidos, y un DNI, y en el segundo, te carge en el datagrid dichos datos, además de permitirte modificarlos haciendo un doble click sobre una fila de éste datagrid (lo que hace es volver a llamar al formulario de inserción de datos, pero a través del constructor modifica ciertas cosas y lo convierte en utilizable para la edición de éstos).

No tene mucho sentido, pero prefiero ir haciendo las cosas poco a poco y de forma separada, para luego unirlos en un solo formulario como "ejemplo final".

La duda que me surge es ésta:
- Hacemos doble click en una fila de datos del datagrid.
- Se nos abre el formulario de edición de registros.
- Modificamos cualquier dato de dicho registro.
-- ¿Cómo puedo hacer que, una vez has editado los datos, se cambie una variable en el formulario del datagrid?

Si modificamos un registro, el datagrid vuelve a cargar los datos de la base de datos, y mi idea es, que además se SELECCIONE en el datagrid la fila que hemos editado a través del formulario de edicion/inserción de datos. Para ello tengo una variable que sería sDNIEditado (en el archivo frmDDBBDataGrid.cs), que tendría que ser modificada desde frmBBDDRegistros.cs, y a través del siguiente bloque de código (que se encuentra en frmDDBBDataGrid.cs), seleccionar la fila editada:
                //Comprobamos si el usuario ha editado el registro a través del resultado del diálogo...
                if (drResultado != DialogResult.Cancel) {
                    //En este caso, deberemos de volver a cargar los registro del DataGrid...
                    CargarRegistros_DataGrid();

                    //Sería interesante, que se seleccionara automáticamente la fila que hemos editado...
                }

Pero la cosa es que, desde frmDDBBRegistros.cs, no me permite acceder a las variables del formulario frmDDBBDataGrid...

¿Alguien me echa un cable? También estaría interesado en alguna mejora/optimización/crítica del código que he aportado...cuando haya logrado hacer esto, fusionaré los dos formularios en uno...y además intentaré crear una clase que gestione todo lo relacionado con el acceso/manipulacion de la base de datos...

Muchas gracias por todo.

P.D.: Aquí esta la dirección de la descarga:
http://www.megaupload.com/?d=8WXM9TOV

EDICIÓN 2:
Pues me ha surgido otra duda.

Vereis, he creado un procedimiento encargado de gestionar el control de las barras de herramientas del toolstripmenu, en el que, según el valor de la propiedad TAG del sender y un switch, llama a un procedimiento u otro...

EDITO3:
Ya he encontrado la solución a la duda #2 en una página inglesa con códigos de c#. Por fin...menuda tontería...sabía yo que tenía que ser algo así...
            //Obtenemos el nombre del botón pulsado...
            string sOpcion = ((ToolStripButton)sender).Tag.ToString();

Poquito a poquito voy aprendiendo...jejeje, nada como uno mismo para sacarse las castañas del fuego...aunque aún sigo liado con la primera duda...a ver si algún alma caritativa... [+risas]

Este es el código:
        //Procedimiento encargado de gestionar el control de la barra de herramientas...
        private void Control_BarraHerramientas(object sender, EventArgs e)
        {
            //switch Convert.ToString(((ToolStripButton)sender.tag) {
            switch (sender.Tag) {
            //switch (Convert.ChangeType(sender, typeof(ToolStripButton)).Tag) {
                case "Nuevo":
                    Insertar_Registro();
                    break;
                case "Editar":
                    Editar_Registro();
                    break;
                case "Borrar":
                    Eliminar_Registro();
                    break;
            }
        }

Este procedimiento está asociado al evento Click de los distintos toolstripbutton's de la barra de herramientas (vamos, que todos los toolstripbuttons comparten el mismo procedimiento para el evento Click)...el problema está en que el compilador me dice que "Error 1 'object' no contiene una definición para 'Tag'".

En VB.net, aunque no estuviera esa propiedad disponible, sí que lo tragaba el compilador, o directamente hacía un CTye(sender, ToolStripButton).Tag, y problema resuelto, pero en C# parece que no se traga ningún tipo de conversión o casting, y directamente el sender.tag me manda a chuparla...

La verdad que he estado buscando y no entiendo el porqué me da problemas...como vereis tengo también comentadas las conversiones, y nada...nada se lo traga...

Como ya dicho, los eventos están bien asignados, los tag's también, y a priori...yo no veo ningún fallo...

¿Alguien me da alguna solución o pista? he estado buscando bastante en internet y no lo he visto...

Un saludo de nuevo, y muchas gracias por todo.

P.D.: La duda #1 sigo también sin poderla resolver...
Bueno, veamos si te he entendido bien, que no son horas y se me ha amontonado un poco semejante post en la cabeza:
Duda 1:
entiendo que lo que queres es, de forma esquemática, lo siguiente:
//Codigo del form padre (no necesariamente mdiParent)

MiTipoDeDato resultadoHijo;
MiFormularioHijo hijo = new MiFormularioHijo(); //Instancio el form
/*
Código de configuración del hijo si es necesaria
*/
hijo.Show(); //O hijo.showDialog(); dependiendo del comportamiento que desees

//Capturar de algún modo un valor de hijo y almacenarlo en resultadoHijo

Bien, la solución depende en gran medida del método que uses para llamar al formulario hijo. Si usas hijo.ShowDialog(); al hacer la llamada se detendrá el proceso del form padre hasta que no se cierre el hijo, (ojo, cierre normal, pero no Dispose(), así que mientras que la instancia del formulario esté referenciada y no se llame específicamente al método Dispose(), el Garbage Collector no se zampará el form de memoria y seguirá accesible. Por ello, sería tan sencillo como crear una propiedad pública en el form hijo que devuelva el valor que interese, y recuperarla desde el padre. Tienes que tener en cuenta que si quieres usar ese valor en todo en otros ámbitos del formulario, en Padre tendrás que declarar la variable que albergará el valor a nivel de clase, en el siguiente ejemplo lo pongo todo junto por abreviar:
//Codigo del form padre (no necesariamente mdiParent)

MiTipoDeDato resultadoHijo;
MiFormularioHijo hijo = new MiFormularioHijo(); //Instancio el form
/*
Código de configuración del hijo si es necesaria
*/
hijo.showDialog();
resultadoHijo = hijo.PropiedadInteresante;


Si lo que quieres es usar Show() para poder trabajar a la vez con padre e hijo, la cosa se complica un poco más, pero poco, pues tendrás que trabajar con eventos y ordenar un poco más las cosas.

Debes considerar que el form hijo tiene que estar declarado a nivel de clase en padre, pues como se seguirá ejecutando código después del Show, si declaras en dentro del método, la ejecución de Padre continuará después del Show() e Hijo quedará fuera de ámbito cuando termine la ejecución del método que lo llama. No obstante, aunque la declaración se haga a nivel de clase, la instancia (el new) se puede realizar dentro del método.

En este caso, no es Padre el que consulta su estado a Hijo llamando a una propiedad, sino que es Hijo el que informará a Padre de un cambio, y entonces éste actuará en consecuencia. Ten en cuenta que Hijo siempre lanzará eventos cuando toque, Padre actuará o no dependiendo de si lo has programado para que así lo haga, por lo que es crucial que escojas capturar el evento correcto, y como esto no se puede hacer en diseño, tocará currárselo a mano, pero tranquilo que es fácil y en Visual Studio IntelliSense te echará una buena mano. A bote pronto, si quieres que informe cada vez que el usuario haya modificado algo, te puede valer el evento Validating, si quieres que sea después de haber modificado, y haya pasado la validación (si no haces ninguna validación considerará siempre válido) puedes usar Validated, y si quieres que sea cuando el usuario cierre el form, te vale el evento FormClosing().

Vamos al código:
partial class Padre
{
    MiFormularioHijo Hijo; //Declaro,pero no instancio el hijo
    MiTipo resultado; //variable para almacenar el resultado

    //Código para hacer tus cosas, propiedades, métodos, y demás frikadas

    void metodoQueLlamaAHijo() //Pongo un método sin más, pero puede ser cualquier cosa
    {
        hijo = new MiFormularioHijo(); //Instancio el formulario

        //creo un handler que relacione el evento con el método
        //que lo va a manejar (hijo_FormClosing, está más abajo)
   hijo.FormClosing += new FormClosingHandler(hijo_FormClosing);

        //A partir de ahora, el hijo estará creado y el evento seguirá asociado
        //hasta que no machaque la variable hijo con otra, o muera la instancia
        //de padre, así que puedo acabar este método sin miedo
    }


    //Creo el método que maneja el evento Closing
    private void hijo_FormClosing(object sender, FormClosingEventArgs e)
    {
        //Cuando se haga un Close() del formulario hijo, o se cierre pinchando
        //en el aspa de la barra de título de la ventana, saltará el evento y
        //el handler llamara a este método para manejarlo.

        this.resultado = hijo.PropiedadInteresante;

        //Como resultado está creado a nivel de clase, a partir de ahora será
        //accesible desde cualquier lugar del código
    }
}

Con eso debería valer, consulta http://msdn.microsoft.com/en-us/library/aa645739(VS.71).aspx para (mucha) más info sobre eventos.

Duda 2:
Verás, es muy sencillo, estás intentando acceder a una propiedad que no existe en la definición de object, sino más abajo en la herencia. El Tag es una propiedad declarada en un nivel de herencia inferior al tipo object, por lo que, aunque sepas que lo que te está viniendo como parámetro es, por ejemplo, una instancia de la clase Form, al ser tratada como object que es lo que te pasa el método manejador, no se puede ver tal cual, tendrás que hacer un cast:

Cast clásico entre tipos. Este cast es el más utilizado. Si MiTipo no pertenece a la cadena de herencias que termina en el tipo original del parámetro sender, soltará una InvalidCastException que deberás controlar en un bloque try-catch si no quieres que pete:
private void formQueSea_EventoQueSea(object sender, EventArgs e)
{
    MiTipo objetoCasteado= (MiTipo) sender; //Esta línea es el casteo en sí.
    objetoCasteado.Tag = //...
    //...
}


Cast "as". La finalidad es la misma, la diferencia es que si falla, en vez de soltar una excepción, devolverá null, pero sólo se puede usar para tipos por referencia (grosso modo, clases) y no para tipos por valor(int, double, una struct...):
private void formQueSea_EventoQueSea(object sender, EventArgs e)
{
    MiTipo objetoCasteado= sender as MiTipo; //Esta línea es el casteo en sí.
    objetoCasteado.Tag = //...
    //...
}
Me deja asombrado que no seas capaz de hacer cosas en C# y si en VB .net, de hecho estás utilizando los mismos ensamblados del framework en uno y en otro, como han dicho por ahí, lo único que te cambia es la sintaxis, que todo sea dicho, VB me parece el mayor enjendro para programar de la historia.

De todas formas, viendo tus dudas, parece que tus problemas vienen mas por el uso de la librería que por la sintaxis en si, cosa que ya es independiente del lenguaje que estés utilizando.

En Microsoft podemos presumir de uno de los trabajos de documentación mas exhaustivos de toda la industria. Lo mejor que puedes hacer es meterte en http://msdn.microsoft.com/es-es/default.aspx, Ahí encontrarás todo lo que necesitas, desde documentación de la librería hasta artículos creados por MVPs de distintas tecnologías basadas en .net, ejemplos, 'How to's... en fin... infinidad de documentación.
Hola, muchas gracias a los dos.

Pues la verdad es que lo único que no conseguía realizar era lo que comenté en las dos dudas anteriores.

La segunda duda, la resolví al poco tiempo como se puede ver en la edición del post, lo único que se me pasó un paréntesis para realizar el casting.

Y la primera duda, la verdad es que claro, al estar orientado a objetos, pues se me había ido un poco la pinza y tal, y no había tenido en cuenta algunos factores, pero la idea que el señor 4s|m3tr|ko0 (por cierto, muchísimas gracias por el post tan bien comentado) ha comentado en sus post la estaba tanteando, pero NO sabía a ciencia cierta si había alguna forma mejor de hacerlo.

A mi también me está dejando asombrado estas chorradas, pero bueno...me he metido en temas más profundos y ahí ya no estoy teniendo ningún problema.

Vandroy, la MSDN la utilizo siempre, siempre, pero hay ciertas cosas que no logro encontrar, o no las veo, y ahí ya se me escapa de mis manos.

Aun así, antes de poner ninguna duda aquí intento buscarla por todos lados y resolverla...que no soy un vago ni nada, me sé buscar bien las habichuelas, pero a veces por no darme cuenta, o directamente no encontrarlo, tengo que recurrir a preguntaros a vosotros.

Bueno, pues poquito a poquito sigo avanzando.

Muchas gracias a los dos por todo ;).
12 respuestas