C# 3 - SQL Server 2008 - binding en textbox

Iniciado por Beowulf, 10 Marzo 2010, 00:48 AM

0 Miembros y 2 Visitantes están viendo este tema.

Beowulf

Saludos a todo:
les comento estoy realizando una aplicacion (basica), realizo la conexion con el servidor usando SqlDataAdapter y SqlConnection, por medio de un comando cargo un dataset con dos tablas, lugo cree una ralacion todo a travez de codigo (dataset no tipado), cuando lo voy a usar todo funciona, un bindingNavigator, dos  BindingSource unidos, pero cuando en un textbox quiero mostar un campo del segundo BindingSource, que tiene la relacion , se desabilita, pero si esto lo hago con un dataGridView funciona perfecto, pero quiero usar el textbox.
Al textbox lo uso de la siguiente manera:
txtNombre.DataBindings.Add(new Binding("Text", Obra.bindingSource1, "eccod", true))
Cualquier ayuda es bien recibida.
La navaja de Occam: la explicación mas simple suele ser que alguien la ha cagado (G. Hause)

MANULOMM

Aparentemente todo esta bien, muestrame el code del form para ver mejor el fallo...

Atentamente,

Juan Manuel Lombana
Medellín - Colombia


Beowulf

Este fue mi ultimo intento:
//FORM con dos dos dataGrid y tres textbox
    public partial class ObraAltas : Form
    {
        private Dax Obra;
        public ObraAltas()
        {
            Obra = new Dax();
            Obra.conection();
            InitializeComponent();
           
            Obra.LeerDatos2("SELECT medmat,mednom,medecv FROM Medicos ","MEDICOS");
            Obra.LeerDatos2("SELECT eccod,ecestado,descrp FROM Ecivil", "ESTACV");
        }

        private void ObraAltas_Load(object sender, EventArgs e)
        {
            Carga();
        }
        private void Carga()
        {
            DataColumn DCPadre = Obra.daxDataSet.Tables["ESTACV"].Columns["eccod"];
            DataColumn DCHijo = Obra.daxDataSet.Tables["MEDICOS"].Columns["medecv"];
            DataRelation Ralation = Obra.daxDataSet.Relations.Add("DAX", Obra.daxDataSet.Tables["ESTACV"].Columns["eccod"], Obra.daxDataSet.Tables["MEDICOS"].Columns["medecv"]);
            BindingSource RelBindinSource = new BindingSource();
            RelBindinSource.DataSource = Obra.bindingSource1;
            Obra.bindingSource1.DataSource = Obra.daxDataSet;
            Obra.bindingSource1.DataMember = "ESTACV";
            RelBindinSource.DataMember = "DAX";

           
            txtNombre.DataBindings.Add(new Binding("Text", Obra.bindingSource1, "eccod", true));
            txtLoc.DataBindings.Add(new Binding("Text", Obra.bindingSource1, "ecestado", true));
            dataGridView1.DataSource = Obra.bindingSource1;
            //FUNCIONA
            dataGridView2.DataSource = RelBindinSource;
            //
            //NO FUNCIONA   
            txtPrueba.DataBindings.Add(new Binding("Text", RelBindinSource, "eccod", true));
            //
            bindingNavigator1.BindingSource = Obra.bindingSource1;
                   
        }

    }

Para buscar el error construi una clase y despeje dinstintas funciones que teoricamente me seria utiles despues
las función leer datos esta en la case Dax y tiene el siguiente codigo:

public void LeerDatos2(string strSQL, string strTabla)
        {
            this.daxAdapter = new SqlDataAdapter(strSQL, this.cnSql);
            SqlCommandBuilder cb = new SqlCommandBuilder(this.daxAdapter);
            cb.QuotePrefix = "[";
            cb.QuoteSuffix = "]";
            this.daxAdapter.UpdateCommand = cb.GetUpdateCommand();
            this.daxAdapter.InsertCommand = cb.GetInsertCommand();
            this.daxAdapter.DeleteCommand = cb.GetDeleteCommand();

            this.daxAdapter.Fill(this.daxDataSet, strTabla);
            this.bindingSource1.DataSource = this.daxDataSet;
     
        }
Las tablas estan bien (creo), al igual que las conexiones por eso no incluyo el codigo
La navaja de Occam: la explicación mas simple suele ser que alguien la ha cagado (G. Hause)

raul338

Cita de: Beowulf en 10 Marzo 2010, 12:58 PM
Código (csharp) [Seleccionar]

       private void ObraAltas_Load(object sender, EventArgs e)
       {
           Carga();
       }
       private void Carga()
       {
           DataColumn DCPadre = Obra.daxDataSet.Tables["ESTACV"].Columns["eccod"];
           DataColumn DCHijo = Obra.daxDataSet.Tables["MEDICOS"].Columns["medecv"];
           DataRelation Ralation = Obra.daxDataSet.Relations.Add("DAX", Obra.daxDataSet.Tables["ESTACV"].Columns["eccod"], Obra.daxDataSet.Tables["MEDICOS"].Columns["medecv"]);

           /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
           BindingSource RelBindinSource = new BindingSource();
           /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

           RelBindinSource.DataSource = Obra.bindingSource1;
           Obra.bindingSource1.DataSource = Obra.daxDataSet;
           Obra.bindingSource1.DataMember = "ESTACV";

           RelBindinSource.DataMember = "DAX";

         
           txtNombre.DataBindings.Add(new Binding("Text", Obra.bindingSource1, "eccod", true));
           txtLoc.DataBindings.Add(new Binding("Text", Obra.bindingSource1, "ecestado", true));
           dataGridView1.DataSource = Obra.bindingSource1;
           //FUNCIONA
           dataGridView2.DataSource = RelBindinSource;
           //
           //NO FUNCIONA    
           txtPrueba.DataBindings.Add(new Binding("Text", RelBindinSource, "eccod", true));
           //
           bindingNavigator1.BindingSource = Obra.bindingSource1;
                   
       }

   }


Usa las etiquetas code :P ([ code=charp ])

Nose, pero para mi seria que el DataBinding se destruye al terminar el metodo carga, el datagrid lo "copia" en cambio el textbox pierde la referencia porque se borro de la memoria (al menos eso pasa en otros ambitos)

Lo que si, declararia el Binding Source en el formulario y no en los metodos. quedando algo asi:

Código (csharp) [Seleccionar]

       /// Siempre queda "vivo"
       BindingSource RelBindinSource = new BindingSource();

       private void ObraAltas_Load(object sender, EventArgs e)
       {
           Carga();
       }
       private void Carga()
       {
           DataColumn DCPadre = Obra.daxDataSet.Tables["ESTACV"].Columns["eccod"];
           DataColumn DCHijo = Obra.daxDataSet.Tables["MEDICOS"].Columns["medecv"];
           DataRelation Ralation = Obra.daxDataSet.Relations.Add("DAX", Obra.daxDataSet.Tables["ESTACV"].Columns["eccod"], Obra.daxDataSet.Tables["MEDICOS"].Columns["medecv"]);
           RelBindinSource.DataSource = Obra.bindingSource1;
           Obra.bindingSource1.DataSource = Obra.daxDataSet;
           Obra.bindingSource1.DataMember = "ESTACV";

           RelBindinSource.DataMember = "DAX";

         
           txtNombre.DataBindings.Add(new Binding("Text", Obra.bindingSource1, "eccod", true));
           txtLoc.DataBindings.Add(new Binding("Text", Obra.bindingSource1, "ecestado", true));
           dataGridView1.DataSource = Obra.bindingSource1;
           //FUNCIONA
           dataGridView2.DataSource = RelBindinSource;
           //
           // deberia funcionar :P
           txtPrueba.DataBindings.Add(new Binding("Text", RelBindinSource, "eccod", true));
           //
           bindingNavigator1.BindingSource = Obra.bindingSource1;
                   
       }
   }


Al menos es eso desde mi punto de vista, tendria que probar

Beowulf

#4
Se me paso lo de code=csahrp
La navaja de Occam: la explicación mas simple suele ser que alguien la ha cagado (G. Hause)

Beowulf

Discupen por hacer la cosas rapido las hice mal.  :-[
Esto es lo que quise postear:
raul338  los cambios que me sugeriste los probe, queda mejor el codigo pero no resolvio el problema, pero mi hizo revizar mejor el codigo y encontre la falla, estoy acostumbrado a otros leguajes que al hacer una relacion quedan todos los campos de las tablas relacionadas (si se lo indica asi en SQL) asumi que seria igual: txtPrueba.DataBindings.Add(new Binding("Text", Obra.RelBindinSource, "CAMPO", true))El campo que estaba usando pertenecia a la tabla principal y no a la tabla relacionada, cuando puse un campo de la segunda tabla todo funciono perfactamente. Gracias por la ayuda
La navaja de Occam: la explicación mas simple suele ser que alguien la ha cagado (G. Hause)

raul338

:) para eso estamos en el foro, para ayudar y que nos ayuden

En cuanto lo del doble post, tienes el boton modificar arriba de los ultimos mensajes tuyo para evitarlos, ya sea agregar cosas, editar accidentes o simplemente decir que lo editaste xD

Beowulf

La navaja de Occam: la explicación mas simple suele ser que alguien la ha cagado (G. Hause)