Usuario
Mover un textbox de un reportviewer usando codigo c#

Pregunta
-
Hola, quisiera que me ayuden con esto: ¿como podría mover un textbox que se encuentra en un reportviewer (ejm: ficha.rdlc) usando código en c#; por ejemplo su locacion en ese espacio (ejm: x=20, y=15), o su background es decir usar sus propiedades
- Editado Bernardinillo viernes, 9 de mayo de 2014 15:39
Todas las respuestas
-
No se puede hacer dinámicamente mientras el report se está viendo en el reportviewer, pero sí podrías cambiar la posición del textbox en el fichero .rdlc (que al fin y al cabo por dentro es un simple XML, lo puedes manipular desde C# mediante cualquiera de las herramientas de manipulación de XML, tal como un XmlDocument), y luego volver a cargar el .rdlc en el ReportViewer mediante .LocalReport.ReportPath:
reportView1.LocalReport.ReportPath = @"ruta\fichero.rdlc"; reportView1.LocalReport.DataSources.Clear(); reportView1.LocalReport.DataSources.Add(ds); reportView1.LocalReport.Refresh();
-
-
-
-
Para manipular el XML, lo primero necesitas examinar el archivo en un editor de texto para ver el aspecto que tiene. Por ejemplo, supongamos que te encuentras esto:
<?xml version="1.0" encoding="utf-8"?> <Report xmlns:....> <Body> <ReportItems> <Textbox Name="Textbox1"> <CanGrow>true</CanGrow> <KeepTogether>true</KeepTogether> <Paragraphs> <Paragraph> <TextRuns> <TextRun> <Value>Esto es una prueba</Value> <Style /> </TextRun> </TextRuns> <Style /> </Paragraph> </Paragraphs> <rd:DefaultName>Textbox1</rd:DefaultName> <Top>2.63737cm</Top> <Left>5.49487cm</Left> <Height>0.6cm</Height> <Width>3.74354cm</Width> .....
Aquí vemos que hay un Textbox que se llama Textbox1, y su propiedad Left vale 5.49487cm. Supongamos que queremos moverlo un poco a la derecha, hasta que se encuentre a 6.5 cm del lado izquierdo. Para ello, tenemos que modificar el nodo "Top" para que en su interior contenga "6.5cm".
Cargaremos el XML dentro de un objeto XmlDocument (en el espacio de nombres System.Xml), buscaremos el nodo mediante una expresión XPATH, y lo volveremos a salvar en disco. Esta sería una versión simplificada del código:
XmlDocument doc = new XmlDcument; doc.LoadXml(@"c:\ruta\prueba.rdlc"); XmlNode nodo = doc.SelectSingleNode("//Textbox[@Name='Textbox1']/Left"); nodo.InnerXml="6.5cm"; doc.Save(@"c:\ruta\prueba2.rdlc");
En realidad, es un poco más complicado porque el XML tiene definido un espacio de nombres (xmlns) predeterminado, y la consulta XPATH no lo toma automáticamente, sino que hay que declararle un prefijo para el xmlns al XmlDocument y meter el prefijo a la expresión XPATH. No recuerdo de memoria cómo se hace exactamente, pero esta es una pregunta bastante frecuente en los foros, así que deberías encontrar un ejemplo rápidamente.
-
Gracias Alberto pero aun no puedo mover el text box aparece un error con mi ruta @"C:\Users\Bernardino\Desktop\ReportViewerInvoiceReport-CSharp\ReportViewerInvoiceReport-CSharp\Report1.rdlc"
para ser mas especifico estoy probando con este ejemplo que descargue de: https://onedrive.live.com/?cid=e14b7266acef3524&id=E14B7266ACEF3524%21192&authkey=!AMS7KtgnbaUE3Jk
y no se si ahi podrias ejemplificar me mas ampliamente a mi y a toda la comunidad en el "//Textbox[@Name='txtTituloReporte']/Left"; agradeciendote previamente y espero no sea una molestia
-
En las preguntas de los foros nunca digas "aparece un error". Copia siempre el mensaje de error exacto, completo y detallado, así como el fragmento relevante del código fuente que produce el error (no te pases poniendo un inmenso bloque de código fuente, límpialo primero hasta que consigas reproducir el error un un mínimo número de líneas de código). Indica la línea exacta en la que se produce el error y toda la información que te suministre el debugger y que sea relevante de cara a poder identificar las causas del error (por ejemplo, los valores que tienen en ese momento las variables que intervienen en la línea del error).
Evidentemente, comprueba la información que puedas verificar, por ejemplo, si el mensaje dice que "no se encuentra el fichero" en una ruta concreta, verifica primero mediante otros medios (explorador de Windows) que el fichero realmente existe en esa ruta. Si te dice que no puede abrirlo porque está en uso, verifica en qué otras partes del programa se abre el fichero, y cerciórate de que se ha hecho el pertinente Close o Dispose según proceda.
En cuanto a lo de "//Textbox[@Name='txtTituloReporte']/Left", se trata de una expresión de búsqueda escrita en el lenguaje XPATH, que es el que entiende el método SelectSingleNode para buscar un elemento XML. Se trataba solo de un ejemplo; evidentemente si quieres seguir esta vía tendrás que aprender XPATH y aplicarlo debidamente al archivo .rdlc (he mirado el que has subido y creo que la expresión es correcta, con la excepción de lo que ya te indiqué en el mensaje anterior acerca de la falta de los espacios de nombres). Si manipulas el fichero con alguna otra herramienta, como por ejemplo un XmlTextReader/XmlTextWriter, o incluso leyendo el fichero en un String y reemplazando subcadenas, entonces el XPATH (y los espacios de nombres) es irrelevante y no tienes por qué preocuparte de él.
Tienes un tutorial de XPATH aquí:
http://www.w3schools.com/XPath/
Sobre los namespaces en XPATH:
-
Si lo que quieres es hacerlo de forma dinámica , para que se vaya cuadrando bien en el reporte, mirate esto:
http://logicarlos.tk/2013/06/crear-xtrareport-con-devexpress-en-c-de-forma-dinamica/
Un saludo!
- Propuesto como respuesta CarlosJVigueras miércoles, 14 de mayo de 2014 12:24
-
aun no me ayuda eso y este es el error: "Los datos del nivel de raíz no son válidos. línea 1, posición 1."
por ello te mande @"C:\Users\Bernardino\Desktop\ReportViewerInvoiceReport-CSharp\ReportViewerInvoiceReport-CSharp\Report1.rdlc" es de suponer que trabajo desde mi escritorio como veraz; de todas maneras gracias seguire buscando..
XmlDocument doc = new XmlDocument();
doc.LoadXml(@"C:\Users\Bernardino\Desktop\ReportViewerInvoiceReport-CSharp\ReportViewerInvoiceReport-CSharp\Report1.rdlc");
XmlNode nodo = doc.SelectSingleNode("//Textbox[@Name='Textbox1']/Left");
nodo.InnerXml = "10cm";
doc.Save(@"C:\Users\Bernardino\Desktop\ReportViewerInvoiceReport-CSharp\ReportViewerInvoiceReport-CSharp\Report1.rdlc"); -
-
[...]"Los datos del nivel de raíz no son válidos. línea 1, posición 1."
[...] doc.LoadXml(@"C:\Users\Bernardino\Desktop\ReportViewerInvoiceReport-CSharp\ReportViewerInvoiceReport-CSharp\Report1.rdlc");
Vale, ya está claro. No es LoadXml sino Load la instrucción de carga que hay que poner. Se usa Load para indicar la RUTA del fichero, mientras que se usa LoadXml para indicar el CONTENIDO. En tu caso, el parámetro que le pasas es un nombre de fichero, no una cadena con XML, por lo que hay que poner doc.Load en lugar de doc.LoadXml. -
ok eso lo tengo claro pero después no se como continuar puesto que sale el mensaje:
nodo.InnerXml = "10cm"; ==>> Referencia a objeto no establecida como instancia de un objeto.
por eso quiero un ejemplo quisaz con un foreach ,talvez, seguiré tratando con este problema...intente con esto tambien ya que me mandaba un null:
doc.LoadXml(@"<Textbox Name='txtTituloReporte'>" +
"<KeepTogether>true</KeepTogether>" +
"<Paragraphs>" + "<Paragraph>" + "<TextRuns>" + "<TextRun>" +
"<Value>=Parameters!parameterTitulo.Value</Value>" + "<Style>" +
"<FontWeight>Bold</FontWeight>" + "</Style>" + "</TextRun>" +
"</TextRuns>" + "<Style>" + "<TextAlign>Center</TextAlign>" +
"</Style>" + "</Paragraph>" + "</Paragraphs>" + "<Top>0.25612cm</Top>" +
"<Left>6.27739cm</Left>" + "<Height>0.6cm</Height>" +
"<Width>7.40094cm</Width>" + "<ZIndex>10</ZIndex>" +
"<Style>" + "<Border>" + "<Style>None</Style>" + "</Border>" +
"<VerticalAlign>Middle</VerticalAlign>" + "<PaddingLeft>2pt</PaddingLeft>" +
"<PaddingRight>2pt</PaddingRight>" + "<PaddingTop>2pt</PaddingTop>" +
"<PaddingBottom>2pt</PaddingBottom>" + "</Style>" + "</Textbox>"
);creo me estoy acercando :D.
-
nodo.InnerXml = "10cm"; ==>> Referencia a objeto no establecida como instancia de un objeto.