Лучший способ просмотреть таблицу с * много * столбцов? - PullRequest
12 голосов
/ 06 ноября 2008

Риск быть урезанным, я хочу спросить, каков наилучший механизм (лучший, очевидно, субъективный для нарушения практики, присущего здесь) для просмотра данных из таблицы, используя C #, с лотом из колонны. Я имею в виду что-то вроде 1000.

Теперь, прежде чем вы будете довольны всеми щелчками или выбросите ответы типа «какого черта у вас когда-нибудь будет таблица с таким количеством столбцов», позвольте мне сказать, что это на самом деле является частью требования к дизайну. Мы собираем данные как можно быстрее из 1000 точек данных. Нам нужно хранить их как можно быстрее, отсюда и плоский стол. Данные должны быть напрямую доступны из SQL Server, следовательно, из базы данных (мы используем SQL Compact с таблицей-direct).

Итак, давайте пока забудем все, что мы узнали о правильном проектировании базы данных, правилах нормализации и т. Д., И сосредоточимся только на том факте, что у меня есть таблица с 1000 столбцами, и я хочу иметь возможность отображать данные на экране, чтобы удостовериться, что эти данные действительно поступают туда.

Я пробовал сетку данных. Его тошнит, потому что (что неудивительно) он не предназначен для обработки такого количества столбцов.

Я пытался использовать программу просмотра в Studio. Он рвется после 256, плюс конечному пользователю все равно не будет установлена ​​Studio.

На данный момент результат не должен быть красивым, не должен обновляться и не должен быть чувствительным к изменениям данных - просто статический снимок данных в таблице в данный момент времени.

Соответствующая (или частично релевантная) информация:

  • Таблица содержит 1000 столбцов (прочитайте выше, прежде чем получить счастливый клик)
  • Использование SQL Compact версии 3.5
  • Бег на рабочий стол
  • Ищем ответ с управляемым кодом

Ответы [ 21 ]

15 голосов
/ 06 ноября 2008

Если вы собираетесь реализовать свой собственный пользовательский элемент управления, вы можете сделать Fisheye Grid следующим образом:

В этом примере показана полноразмерная панель 3x4, перемещающаяся в пределах таблицы 9x10. Поскольку (я полагаю) вам не нужно редактировать эти данные, пользовательский интерфейс может быть просто чем-то, где пользователь берет панель и перетаскивает ее. Если вы действительно мазохистки и / или имеете много свободного времени, вы можете даже иметь несколько панелей «рыбий глаз» на одной и той же сетке, что позволяет сравнивать один или несколько регионов сетки одновременно.

Обновление: Silverlight имеет один из этих , по-видимому. Вроде.

14 голосов
/ 06 ноября 2008

Вы можете отформатировать все числа в виде n-символьных строк с пробелами, а затем отобразить их шрифтом фиксированной ширины.

1       2       3       4       6      36     436    6346
2       3       4       6      36     436    6346       0
3       4       6      36     436    6346       3       4
4       6      36     436    6346     333     222     334
12 голосов
/ 07 ноября 2008

Хорошо, для меня оказалось правильным использовать элемент управления ReportViewer , но никак не документированный в MSDN. Проблема в том, что у меня есть динамические данные, поэтому мне нужен динамический отчет, и все учебные пособия и т. Д., Похоже, предполагают, что вы обладаете роскошью знать все во время разработки, поэтому вы можете указывать и пробираться через мастера. 1003 *

Для решения проблемы потребовалось несколько штук. Сначала мне пришлось создать код для динамической генерации RDLC, который ReportViewer использует для описания макета отчета и того, какие поля данных соответствуют чему. Вот что я придумал:

public static Stream BuildRDLCStream(
    DataSet data, string name, string reportXslPath)
{
  using (MemoryStream schemaStream = new MemoryStream())
  {
    // save the schema to a stream
    data.WriteXmlSchema(schemaStream);
    schemaStream.Seek(0, SeekOrigin.Begin);

    // load it into a Document and set the Name variable
    XmlDocument xmlDomSchema = new XmlDocument();
    xmlDomSchema.Load(schemaStream);        
    xmlDomSchema.DocumentElement.SetAttribute("Name", data.DataSetName);

    // load the report's XSL file (that's the magic)
    XslCompiledTransform xform = new XslCompiledTransform();
    xform.Load(reportXslPath);

    // do the transform
    MemoryStream rdlcStream = new MemoryStream();
    XmlWriter writer = XmlWriter.Create(rdlcStream);
    xform.Transform(xmlDomSchema, writer);
    writer.Close();
    rdlcStream.Seek(0, SeekOrigin.Begin);

    // send back the RDLC
    return rdlcStream;
  }
}

Второй фрагмент - это XSL-файл, который я взял прямо из блога Дэна Шайпа . Код RDLC был довольно бесполезным, так как все было предназначено для использования в Интернете, но XSL - чистое золото. Для полноты я поместил его внизу этого поста на тот случай, если этот блог когда-нибудь отключится.

После того, как у меня есть эти две части, нужно было просто создать форму с элементом управления ReportViewer, а затем использовать этот бит кода для ее настройки:

ds.DataSetName = name;

Stream rdlc = RdlcEngine.BuildRDLCStream(
    ds, name, "c:\\temp\\rdlc\\report.xsl");

reportView.LocalReport.LoadReportDefinition(rdlc);
reportView.LocalReport.DataSources.Clear();
reportView.LocalReport.DataSources.Add(
    new ReportDataSource(ds.DataSetName, ds.Tables[0]));
reportView.RefreshReport();

Ключевым моментом здесь является то, что 'ds' является объектом DataSet с одной таблицей DataTable с данными для отображения.

Опять же, для полноты, вот XSL - извините за размер:

    <?xml version="1.0"?>
    <!-- Stylesheet for creating ReportViewer RDLC documents -->
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
      xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"  xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"
      >

     <xsl:variable name="mvarName" select="/xs:schema/@Name"/>
     <xsl:variable name="mvarFontSize">8pt</xsl:variable>
     <xsl:variable name="mvarFontWeight">500</xsl:variable>
     <xsl:variable name="mvarFontWeightBold">700</xsl:variable>


     <xsl:template match="/">
      <xsl:apply-templates select="/xs:schema/xs:element/xs:complexType/xs:choice/xs:element/xs:complexType/xs:sequence">
      </xsl:apply-templates>
     </xsl:template>

     <xsl:template match="xs:sequence">
      <Report xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition">
       <BottomMargin>1in</BottomMargin>
       <RightMargin>1in</RightMargin>
       <LeftMargin>1in</LeftMargin>
       <TopMargin>1in</TopMargin>
       <InteractiveHeight>11in</InteractiveHeight>
       <InteractiveWidth>8.5in</InteractiveWidth>
       <Width>6.5in</Width>
       <Language>en-US</Language>
       <rd:DrawGrid>true</rd:DrawGrid>
       <rd:SnapToGrid>true</rd:SnapToGrid>
       <rd:ReportID>7358b654-3ca3-44a0-8677-efe0a55c7c45</rd:ReportID>

       <xsl:call-template name="BuildDataSource">
       </xsl:call-template>

       <xsl:call-template name="BuildDataSet">
       </xsl:call-template>

       <Body>
        <Height>0.50in</Height>
        <ReportItems>
         <Table Name="table1">
          <DataSetName><xsl:value-of select="$mvarName" /></DataSetName>
          <Top>0.5in</Top>
          <Height>0.50in</Height>
          <Header>
           <TableRows>
            <TableRow>
             <Height>0.25in</Height>
             <TableCells>

              <xsl:apply-templates select="xs:element" mode="HeaderTableCell">
              </xsl:apply-templates>

             </TableCells>
            </TableRow>
           </TableRows>
          </Header>
          <Details>
           <TableRows>
            <TableRow>
             <Height>0.25in</Height>
             <TableCells>

              <xsl:apply-templates select="xs:element" mode="DetailTableCell">
              </xsl:apply-templates>

             </TableCells>
            </TableRow>
           </TableRows>
          </Details>
          <TableColumns>

           <xsl:apply-templates select="xs:element" mode="TableColumn">
           </xsl:apply-templates>

          </TableColumns>
         </Table>
        </ReportItems>
       </Body>
      </Report>
     </xsl:template>

     <xsl:template name="BuildDataSource">
      <DataSources>
       <DataSource Name="DummyDataSource">
        <ConnectionProperties>
         <ConnectString/>
         <DataProvider>SQL</DataProvider>
        </ConnectionProperties>
        <rd:DataSourceID>84635ff8-d177-4a25-9aa5-5a921652c79c</rd:DataSourceID>
       </DataSource>
      </DataSources>
     </xsl:template>

     <xsl:template name="BuildDataSet">
      <DataSets>
       <DataSet Name="{$mvarName}">
        <Query>
         <rd:UseGenericDesigner>true</rd:UseGenericDesigner>
         <CommandText/>
         <DataSourceName>DummyDataSource</DataSourceName>
        </Query>
        <Fields>

         <xsl:apply-templates select="xs:element" mode="Field">
         </xsl:apply-templates>

        </Fields>
       </DataSet>
      </DataSets>
     </xsl:template>

     <xsl:template match="xs:element" mode="Field">
      <xsl:variable name="varFieldName"> 
       <xsl:value-of select="@name" />
      </xsl:variable>

      <xsl:variable name="varDataType">
       <xsl:choose>
        <xsl:when test="@type='xs:int'">System.Int32</xsl:when>
        <xsl:when test="@type='xs:string'">System.String</xsl:when>
        <xsl:when test="@type='xs:dateTime'">System.DateTime</xsl:when>
        <xsl:when test="@type='xs:boolean'">System.Boolean</xsl:when>
       </xsl:choose>
      </xsl:variable>

      <Field Name="{$varFieldName}">
       <rd:TypeName><xsl:value-of select="$varDataType"/></rd:TypeName>
       <DataField><xsl:value-of select="$varFieldName"/></DataField>
      </Field>
     </xsl:template>

     <xsl:template match="xs:element" mode="HeaderTableCell">
      <xsl:variable name="varFieldName"> 
       <xsl:value-of select="@name" />
      </xsl:variable>

      <TableCell>
       <ReportItems>
        <Textbox Name="textbox{position()}">
         <rd:DefaultName>textbox<xsl:value-of select="position()"/>
         </rd:DefaultName>
         <Value><xsl:value-of select="$varFieldName"/></Value>
         <CanGrow>true</CanGrow>
         <ZIndex>7</ZIndex>
         <Style>
          <TextAlign>Center</TextAlign>
          <PaddingLeft>2pt</PaddingLeft>
          <PaddingBottom>2pt</PaddingBottom>
          <PaddingRight>2pt</PaddingRight>
          <PaddingTop>2pt</PaddingTop>
          <FontSize><xsl:value-of select="$mvarFontSize"/></FontSize> 
          <FontWeight><xsl:value-of select="$mvarFontWeightBold"/></FontWeight> 
          <BackgroundColor>#000000</BackgroundColor> 
          <Color>#ffffff</Color>
          <BorderColor>
           <Default>#ffffff</Default>
          </BorderColor>
          <BorderStyle>
           <Default>Solid</Default>
          </BorderStyle>
         </Style>
        </Textbox>
       </ReportItems>
      </TableCell>
     </xsl:template>

     <xsl:template match="xs:element" mode="DetailTableCell">
      <xsl:variable name="varFieldName"> 
       <xsl:value-of select="@name" />
      </xsl:variable>

      <TableCell>
       <ReportItems>
        <Textbox Name="{$varFieldName}">
         <rd:DefaultName><xsl:value-of select="$varFieldName"/></rd:DefaultName>
         <Value>=Fields!<xsl:value-of select="$varFieldName"/>.Value</Value>
         <CanGrow>true</CanGrow>
         <ZIndex>7</ZIndex>
         <Style>
          <TextAlign>Left</TextAlign>
          <PaddingLeft>2pt</PaddingLeft>
          <PaddingBottom>2pt</PaddingBottom>
          <PaddingRight>2pt</PaddingRight>
          <PaddingTop>2pt</PaddingTop>
          <FontSize><xsl:value-of select="$mvarFontSize"/></FontSize> 
          <FontWeight><xsl:value-of select="$mvarFontWeight"/></FontWeight> 
          <BackgroundColor>#e0e0e0</BackgroundColor> 
          <Color>#000000</Color> 
          <BorderColor>
           <Default>#ffffff</Default> 
          </BorderColor>
          <BorderStyle>
            <Default>Solid</Default>
          </BorderStyle>
         </Style>
        </Textbox>
       </ReportItems>
      </TableCell>
     </xsl:template>

     <xsl:template match="xs:element" mode="TableColumn">
      <TableColumn>
       <Width>0.75in</Width>
      </TableColumn>
     </xsl:template>

     <xsl:template name="replace-string">
      <xsl:param name="text"/>
      <xsl:param name="from"/>
      <xsl:param name="to"/>
      <xsl:choose>
       <xsl:when test="contains($text, $from)">
        <xsl:variable name="before" select="substring-before($text, $from)"/>
        <xsl:variable name="after" select="substring-after($text, $from)"/>
        <xsl:variable name="prefix" select="concat($before, $to)"/>
        <xsl:value-of select="$before"/>
        <xsl:value-of select="$to"/>
        <xsl:call-template name="replace-string">
         <xsl:with-param name="text" select="$after"/>
         <xsl:with-param name="from" select="$from"/>
         <xsl:with-param name="to" select="$to"/>
        </xsl:call-template>
       </xsl:when>
       <xsl:otherwise>
        <xsl:value-of select="$text"/>
       </xsl:otherwise>
      </xsl:choose>
     </xsl:template>
    </xsl:stylesheet>
6 голосов
/ 06 ноября 2008

Как насчет хранения данных в CSV-файле, который даст вам возможность просмотра. Если у вашего пользователя есть Excel или Open Office Calc, он может легко импортировать данные (не уверен, что в Calc есть ограничение на количество столбцов, но Excel 2007 может содержать 16384 столбца) и просматривать их в этой программе?

3 голосов
/ 06 ноября 2008

вам нужно просмотреть несколько строк в одной таблице?

my думаю, в том, что эти данные являются числовыми, есть ли способ отобразить данные из одной строки в виде сетки 20 * 50 или что-то в этом роде, а затем просто разбить строки на строки?

Например, строка 1, столбец 1 = столбец 1 базы данных, строка 2, столбец 1 = столбец 21 базы данных и т. Д.

Id = 1
     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
----|--------------------------------------------------------
  0 |  
 20 |  
 40 |
 60 |
 80 |
100 |
120 |
etc |
2 голосов
/ 06 ноября 2008

попробуйте таблицу html с очень маленьким шрифтом

если вы заинтересованы в форматировании таблицы, используйте CSS:

td { font-size: 0.2em; text-align: right; }

поочередно, если все ваши номера имеют одинаковый размер, вы также можете просто сгенерировать «стену чисел», например использовать шрифт фиксированной ширины и отображать столбцы шириной 5 символов на панели прокрутки

1 голос
/ 06 ноября 2008

Это зависит от того, насколько она должна быть красивой. Если это всего лишь инструмент отладки / выборочной проверки, вы можете поместить несколько DataGrids рядом, каждый из которых отображает выборку столбцов. Было бы некрасиво, но выполнимо.

OTOH, если вам нужен полуполированный инструмент, вы можете предложить пользовательский элемент управления для его обработки. По сути, вы бы загружали просматриваемый раздел базы данных с небольшим количеством буфера, а когда пользователь прокручивал текущие загруженные данные, запускал новый запрос.

1 голос
/ 06 ноября 2008

DataGrid (или даже ListView) должен иметь возможность обрабатывать таблицу с 32 столбцами и 32 строками, что позволит вам отображать всю сумму данных в строке БД одновременно. Это позволит вам мгновенно увидеть, отсутствуют ли в некоторых ячейках данные.

0 голосов
/ 23 июня 2010

Учитывая, что пользователю все равно придется прокручивать по горизонтали, вы можете использовать обычную сетку данных, показывающую разумное количество столбцов (скажем, 50). Затем у вас есть горизонтальная полоса прокрутки, расположенная под сеткой, которая выбирает подмножество столбцов для отображения. Когда полоса прокрутки находится слева, отображаются столбцы 1–50, при нажатии стрелки вправо - 2–51 и т. Д.

Это дает вам возможность прокрутки без необходимости перегружать элемент управления сеткой данными. Хотя вы потеряете возможность свободно перемещаться по таблице или делать большие прямоугольные выделения, это не похоже на проблему для этого приложения.

0 голосов
/ 13 января 2009

.. чтобы убедиться, что данные на самом деле поступают туда.

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

Цвет пикселя будет зависеть от данных. Это может быть черный / белый для пустых / данных. Или это может быть цвет, чтобы показать, что значение растет или уменьшается с каждой строкой. Или красный для внезапных скачков данных. Все аномалии, которые вы обычно можете заметить в сетке данных.

Тогда все, что вам нужно, это поймать координаты щелчка в интересующей области и использовать небольшую таблицу, чтобы показать эту часть таблицы без прокрутки.

Просто нажмите, чтобы вернуться к пиксельной карте.

...