SSRS - Keep a table the same width when hiding columns dynamically? SSRS - Keep a table the same width when hiding columns dynamically? sql sql

SSRS - Keep a table the same width when hiding columns dynamically?


The only way I know how to accomplish this, is by altering your RDLC file during runtime. Basically, you can load up your RLDC file into memory (its just an XML file), locate the XML node that contains the width of your table - then modify the setting in memory. Once you have done that, you can refresh your reportViewer control using the RDLC file that is loaded in memory.

And yes, I have already done this, and it does work.

The following code example is to alter the data of an RDLC file in memory, via its XMLpath.

  Private Sub ModifyRDLCInMemory()    Dim xmlDoc As XmlDocument = New XmlDocument    Dim asm As Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly()    'create in memory, a XML file from a embedded resource    Dim xmlStream As Stream = asm.GetManifestResourceStream(ReportViewer1.LocalReport.ReportEmbeddedResource)    Try      'Load the RDLC file into a XML doc      xmlDoc.Load(xmlStream)    Catch e As Exception      MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)    End Try    'Create an XmlNamespaceManager to resolve the default namespace    Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(xmlDoc.NameTable)    nsmgr.AddNamespace("nm", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition")    nsmgr.AddNamespace("rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner")    'Loop through each node in the XML file    Dim node As XmlNode    For Each node In xmlDoc.DocumentElement.SelectNodes(String.Format("//nm:{0}[@rd:LocID]", "Value"), nsmgr)  'XPath to LocID node.. You will want to change this to locate your Table Width node. You may need to read up on XMLPath      Dim nodeValue As String = node.InnerText  'Gets current value of Node      If (String.IsNullOrEmpty(nodeValue) Or Not nodeValue.StartsWith("=")) Then        Try          node.InnerText = YOURNEWVALUE        Catch ex As Exception          'handle error        End Try      End If    Next    ReportViewer1.LocalReport.ReportPath = String.Empty    ReportViewer1.LocalReport.ReportEmbeddedResource = Nothing    'Load the updated RDLC document into LocalReport object.    Dim rdlcOutputStream As StringReader = New StringReader(xmlDoc.DocumentElement.OuterXml)    Using rdlcOutputStream      ReportViewer1.LocalReport.LoadReportDefinition(rdlcOutputStream)    End Using  End Sub


The best choice is to duplicate the table and put in above the other with the columns you want to show. Then you can set the visibility of the table dinamycallly. In order to make them editable you put one table a little smaller thant the other to select it when it is above one.