SSRS - Сохранить размер таблицы при динамическом скрытии столбцов? - PullRequest
9 голосов
/ 17 сентября 2009

Привет.

У меня есть отчет SSRS 2005, в котором указаны цены на вещи. Для некоторых клиентов я скрываю столбец из таблицы (с выражением в видимости - скрытое свойство).

Когда я делаю это, мой стол сжимается. Я искал долго и упорно способ динамически изменять размер этой таблицы (или что-то делать во время разработки, чтобы сделать его пребывание в ту же ширину), но я застрял.

Ответы, в которых просто говорится: «Ты не можешь сделать это», мне не помогут. Я уже читал это: http://forums.asp.net/t/1354956.aspx

Я надеюсь, что у какой-нибудь умной души сообщества SO есть обходной путь для меня. Спасибо!

1 Ответ

6 голосов
/ 17 сентября 2009

Единственный способ, которым я знаю, как это сделать, - это изменить ваш файл RDLC во время выполнения. По сути, вы можете загрузить свой файл RLDC в память (это просто файл XML), найти узел XML, который содержит ширину таблицы, а затем изменить настройки в памяти. После этого вы можете обновить свой элемент управления reportViewer, используя файл RDLC, который загружен в память.

И да, я уже сделал это, и это работает.

--- EDIT --- В следующем примере кода показано изменение данных файла RDLC в памяти через его XML-путь.

  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
...