SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: +Onis en Miércoles 29 de Junio de 2011, 13:18

Título: Pasar variables de un Form a otro
Publicado por: +Onis en Miércoles 29 de Junio de 2011, 13:18
Hola a todos!! de primeras gracias a los que hagan el esfuerzo de leerlo y más a los que respondan.

Mi problema, aparte de q soy novato, es el hecho de pasar una variable que he capturado de un campo de un doc XML, y tratarlo en otro form para insertarlo en una tabla Oracle.

Os paso el código:

FORM1
-----------

namespace pruebaXML
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)
{
RecogerXML_PedidoTienda();
}

private void button3_Click(object sender, EventArgs e)
{

MostrarCampos_PedidoTienda();

}

private void button2_Click(object sender, EventArgs e)
{
this.Close();
}

private void button4_Click(object sender, EventArgs e)
{
InsertarDatos f = new InsertarDatos();
f.ShowDialog();


}

//private static readonly string cnnStr = ConfigurationManager.ConnectionStrings["xTrelaIntegracionConnectionString"].ConnectionString;
private static readonly string cnnStrTPV = ConfigurationManager.ConnectionStrings["xTrelaTPVConnectionString"].ConnectionString;


//Código encargado de realizar la conexion con la bbdd
//y de llamar al método que realiza la recogida del XML del campo de la bbdd
//y de crear el archivo xml en la ruta especificada
private void RecogerXML_PedidoTienda()
{

XmlDocument doc = new XmlDocument();

SqlConnection cnn = new SqlConnection(cnnStrTPV);

cnn.Open();

LoadXml(cnn, doc);

cnn.Close();

doc.Save("C:\Users\davidma\Desktop\OutputXml.xml");

MessageBox.Show("Archivo XML importado y creado correctamente", "Info",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}

//Método que recoge el campo xml de la bbdd
protected bool LoadXml(SqlConnection cnn, XmlDocument doc)
{
//Leemos el campo serialización(XML) de la bbdd.
string sql = @"SELECT Serializacion
FROM xTrelaTPV..OPERACIONES
WHERE IdOperacion = @IdOperacion
AND idtabla=@idtabla";

SqlCommand cm = new SqlCommand(sql, cnn);
cm.Parameters.Add(new SqlParameter("@IdOperacion", 10001901982));//id de ejemplo
cm.Parameters.Add(new SqlParameter("@Idtabla", 122));//idtabla PedidosTiendas
using (SqlDataReader dr = cm.ExecuteReader())
{
if (dr.Read())
{
SqlXml MiXml = dr.GetSqlXml(dr.GetOrdinal("Serializacion"));
doc.LoadXml(MiXml.Value);
return true;
}
else
{
return false;
}
}
}


//Método encargado de sacar los campos del xml
//moviendose por los diferentes nodos del archivo
public void MostrarCampos_PedidoTienda() {
XmlDocument xDoc = new XmlDocument();//XmlDocument nos permite editar el XML
//La ruta del documento XML permite rutas relativas
//respecto del ejecutable!


xDoc.Load("C:/Users/davidma/Desktop/OutputXml.xml");//ruta del archivo xml
XmlNodeList pedidostiendas =
xDoc.GetElementsByTagName("PedidoTienda");//idtabla=122-->PedidosTiendas
//XmlNodeList lista =
//((XmlElement)pedidotienda[0]).GetElementsByTagName("tiendapedido");

string contenido;//variable fuera del bucle para poder hacer el return
//y llamarla desde otro form

foreach (XmlElement nodo in pedidostiendas)
{

int i = 0;

XmlNodeList nEntityState = nodo.GetElementsByTagName("EntityState");
XmlNodeList nCodigoBarras = nodo.GetElementsByTagName("CodigoBarras");


contenido = String.Format
("nEntityState={0}nCodigoBarras={1}",
nEntityState.InnerText,

nCodigoBarras.InnerText,


//-------------------------------------------------------------------
//-------------------------------------------------------------------




//separaciones para diferenciar los nodos(a la hora de sacarlo por pantalla)
//que a su vez son diferentes tablas...
string separacion = "<PedidoTienda>";
//end separaciones

string msg = (separacion + contenido);

MessageBox.Show(msg, "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);


// return contenido;//kitar si peta
}

}

}


FORM2
-----------

namespace pruebaXML
{
public partial class InsertarDatos : Form
{
public InsertarDatos()
{
InitializeComponent();

}


private void button1_Click(object sender, EventArgs e)
{
ConnectToOracle();//(OraSid,OraPass,OraUser);
}


public void ConnectToOracle()
{
System.Data.OracleClient.OracleConnection conn =
new System.Data.OracleClient.OracleConnection();

// TODO: Modify the connection string and include any
// additional required properties for your database.
conn.ConnectionString =
"Data Source=DEVELOP_ORASRVDEV03;"+//schema bbdd
"User ID=libra;"+ //usuario
"Password=libra521fordevelopers"; //password

try
{
conn.Open();
MessageBox.Show("Conexión realizada con éxito!","INFO",MessageBoxButtons.OK,MessageBoxIcon.Information);
// Insert code to process data.

//Declaro una variable de tipo command del oracle
System.Data.OracleClient.OracleCommand MiComando = new System.Data.OracleClient.OracleCommand();
//Declaro mis parametros que voy a utilizar
System.Data.OracleClient.OracleParameter EntityS;
System.Data.OracleClient.OracleParameter codigoB;

//Instanceo mis parametros
EntityS = new System.Data.OracleClient.OracleParameter();
codigoB = new System.Data.OracleClient.OracleParameter();

//Asigna a los parámetros los valores que serán almacenados
EntityS.OracleType = System.Data.OracleClient.OracleType.VarChar;
codigoB.OracleType = System.Data.OracleClient.OracleType.Int32;

//Le doy nombre a los parametros
EntityS.ParameterName = "Param1";
codigoB.ParameterName = "Param2";

//Declaro la variable "form" del tipo formulario
//para llamar a las variables del Xml
//--> Form1 coger = new Form1();

////////////////


//les digo de que tipo de parametros van a hacer.
//contenido.getstring();

// string entitystate = Form1.MostrarCampos_PedidoTienda(contenido);


//string EntityState1 = Form1.MostrarCampos_PedidoTienda(contenido.nEntityState);



//int i = 0;
//EntityState.Value = coger.nEntityState.Text.ToString();//variables(del xml) del otro form
//codigoB.Value = Int32.Parse(coger.nCodigoBarras.Text.ToString());// "


//Limpio los parametros que voy a utilizar evitando alguna basura...
MiComando.Parameters.Clear();

//agrego los parametros para la ejecucion del comando
MiComando.Parameters.Add(EntityS);
MiComando.Parameters.Add(codigoB);

//agrego el comando a ser ejecutado
MiComando.CommandText = "Insert into TO_PRUEBAS(EstadoEntidad,CodigoBarras)values(Param1,Param2)";


//simplemente y sencillamente abro la conexion ejecuto el comando
//y luego cierro la conexion
conn.Open();
MiComando.ExecuteNonQuery();
//MiComando.ExecuteOracleNonQuery();
//conn.Close();

}
catch
{
MessageBox.Show("Error al conectar/insertar datos a la base de datos","ERROR",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
finally
{
conn.Close();

}
}

private void button2_Click(object sender, EventArgs e)
{
this.Close();
MessageBox.Show("Conexión cerrada después de realizar tareas con éxito", "INFO", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}

}
//}

-----------------------------------------------------------
-----------------------------------------------------------
Bueno llegado este punto, os comento....he borrado muchas variables para no hacerlo más engorroso, asi que solo he dejado 2 para hacer la prueba(obviamente en Oracle hay una tabla con campos vacios dond esperan estas variables).

La cosa es que, en el primer Form, recoge los campos del XML, los separa, y los mete en variables, vease nEntityState, y luego en "contenido"-->que en realidad este contenido es para juntarlo todo y sacarlo en un msg,,,supongo que no es necesario para realizar el return,,o si,, :S

Desde el Form2, se deben llamar a estas variables para poderlas insertar en la tabla,,,pero no se como trabajar con ellas desde otro form,,,he provado el tema del return pero m da error....
Espero hayais entendido toda la metodologia y m podais ayudar.

Muchisimas gracias!
Título: Re: Pasar variables de un Form a otro
Publicado por: gabio2 en Miércoles 29 de Junio de 2011, 16:45
Valiente...... si.. valiente el que  haya leído todoo ese testamento.. yo..... NO jajaja.. prefiero darte una solución simple y sencilla basandome del Título de tu problema "Pasar variables de un form a otro".

Bueno.. digamos que tienes Form1 y Form2.. y que en el Form1 haces todooooo ese procedimiento que pusiste arriba y que quieres enviar el XmlDocument al Form2... si eso es correcto entonces la respuesta es tan sencilla como esto:

Código: C#
  1.  
  2. //En tú Form2 declaras una variable global y PÚBLICA:
  3. public XmlDocument objXML;
  4.  
  5.  

Ahora una vez que tienes declarada tu variable pública en tu Form2, basta hacer una igualdad:

Código: C#
  1.  
  2. //En tú formulario Form1 haces lo siguiente:
  3.  
  4. Form2 frm = new Form2();
  5. frm.objXML = tuObjetoXmlDocument;
  6. frm.Show();
  7.  
  8.  

Y listo tú Form2 ya tiene tu objeto, ahora si no quisieras usar variables Globales, también otra respuesta pudo haber sido usar un constructor en el cual le envies un objeto de tipo XmlDocument y luego dentro del constructor hagas la igualación.....
cualquiera de las 2 es válida.. tú decides. saludos :)
Título: Re: Pasar variables de un Form a otro
Publicado por: ProfesorX en Miércoles 29 de Junio de 2011, 17:12
Hola onis2, te recomiendo que utilices [ code][ /code] (sin espacio en los corchetes) cuando publiques tu codigo, o en el editor utiliza el code, que esta junto al boton de quote para encerrar tu codigo, eso mejora la legibilidad, porque la verdad asi como publicaste tu codigo esta ilegible.

Bueno, trate de compilar tu codigo, pero como esta incompleto, me da error, en fin revisando lo poco que pude ver, ya que como dije anets tu codigo esta ilegible parece que el error esta aca:

Código: C#
  1. public void MostrarCampos_PedidoTienda()
  2.  
y aca

Código: C#
  1.  string entitystate = Form1.MostrarCampos_PedidoTienda(contenido);
  2.  

Para poder regresar valores con return, debes definir el metodo del tipo que deseas regresar y no como void, o tambien puedes utilizar parametros.

Utilizando tipos de retorno (return):

Código: C#
  1.  
  2.         public string MostrarCampos_PedidoTienda()
  3.         {
  4.             // Bla blba bla mi codigo.
  5.             return contenido;
  6.         }
  7.  
  8.  

Código: C#
  1. string entitystate = Form1.MostrarCampos_PedidoTienda();
  2.  

Utilizando parametros:

Código: C#
  1.  
  2.         public void MostrarCampos_PedidoTienda(ref string contenido)
  3.         {
  4.             // Bla blba bla mi codigo.
  5.         }
  6.  
  7.  

Código: C#
  1.  
  2. Form1.MostrarCampos_PedidoTienda(ref contenido);
  3. string entitystate = contenido;
  4.  
  5.  

En este caso es igual que utilices tipos de retorno o parametros, ya que solo necesitas un valor.
Si necesitas regresar mas de un valor, eso no se puede hacer con return, en ese caso se utilizan forzozamente parametros

P.D.: en lo que estaba escribiendo mi solucion te dieron respuesta, esa forma que recomienda gabio2 tambien es valida

Saludos :)
Título: Re: Pasar variables de un Form a otro
Publicado por: +Onis en Miércoles 29 de Junio de 2011, 17:16
muchas gracias!!! perdon por el formato ,,,a la proxima estará todo más legible.

En cuanto modifique todo como me comentais, os digo el que.

Muchisimas gracias a los dos(y a quien tb responda) y perdonad el parrafon :P