views:

1028

answers:

3

Greetings.

I have a SSRS 2005 report that shows prices of things. For some customers, I hide a column from the table (with an expression on the Visibility - hidden property).

When I do this, my table shrinks. I've searched long and hard for a way to dynamically resize this table (or to do something at design time to make it stay the same width), but I'm stuck.

Answers that simply state 'You can't do this' won't help me. I've read that already: http://forums.asp.net/t/1354956.aspx

I'm hoping that some smart soul of the SO community has a workaround for me. Thanks!

+3  A: 

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.

--- EDIT --- 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
Jon
Very interesting take on the problem. I'm going to give it another hour or so and if no one shows up with a better solution I'll mark you as answer. Thanks!
Joe Behymer
I can past some VB.NET code to help you out if you want.. I will right now actually.
Jon
Code Posted. Let me know if you have any questions about it. We used to localize our reports with this method (altering the data when the language was switched). We are now generating our reports dynamically, so we don't use this anymore.
Jon
Awesome, thanks Jon.
Joe Behymer
A: 

Jon,

I have similar situation. We use the 2008 reporting services. In our report we have around 89 columns. We display only columns that needed to be displayed. The columns width are set to 0. We need to only set the width to desire size for the columns that has value or visible. We use Tablix (table) control for this report. How can I leverage you above code to achieve this?

Krish