none
Mover un textbox de un reportviewer usando codigo c# RRS feed

  • 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
    jueves, 8 de mayo de 2014 14:34

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();
    

    jueves, 8 de mayo de 2014 14:51
  • Hola:

     Desde codigo que yo sepa esto no es posible, tal vez si revisaras el "layout" del reporte que es un archivo Xml, en donde se definen los valores que comentas te puedas dar una idea...


    Saludos desde Monterrey, Nuevo León, México!!!

    jueves, 8 de mayo de 2014 19:24
  • Gracias, pero aun no me queda algo claro no se si podrías por favor poner un ejemplo un poco mas especifico para mover el textbox mediante código para ver como manipulas el xml??
    viernes, 9 de mayo de 2014 15:03
  • Gracias pero me gustaria poder ver un ejemplo sencillo para poder hacerlo en código igualmente gracias :D 
    viernes, 9 de mayo de 2014 15:28
  • 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.

    viernes, 9 de mayo de 2014 15:47
  • 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

    martes, 13 de mayo de 2014 14:55
  • 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:

    http://support.microsoft.com/kb/318545

    martes, 13 de mayo de 2014 19:09
  • 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
    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");

    miércoles, 14 de mayo de 2014 13:59
  • Gracias Carlos me instruire saludos!! igualmente :D
    miércoles, 14 de mayo de 2014 13:59
  • [...]"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.
    miércoles, 14 de mayo de 2014 14:18
  • 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.

    miércoles, 14 de mayo de 2014 17:33
  • nodo.InnerXml = "10cm"; ==>> Referencia a objeto no establecida como instancia de un objeto.

    Eso significa que "nodo" es null. Y si nodo es null, significa que doc.SelectSingleNode("//etc etc"); no ha encontrado en el XML nada que satisfaga esa expresión. Y una razón por la que puede ser que no encuentre nada es que no hayas seguido correctamente las instruciones que había en el enlace que ya te indiqué (http://support.microsoft.com/kb/318545/en-us) para incorporar el namespace del XML. Sin hacer eso no funcionará.
    miércoles, 14 de mayo de 2014 17:58