14

ダウンモッドされるリスクがあるので、C#を使用して、多くの列を持つテーブルからデータを表示するための最良のメカニズム(ここに固有のプラクティス違反に対して明らかに主観的です)を尋ねたいと思います。多くの場合、私は1000のようなものを意味します。

すべてのクリックを満足させる前に、または「なぜこれほど多くの列を持つテーブルがあるのか​​」などの応答をスローする前に、それは実際には設計要件の一部であると言わせてください。1000個のデータポイントから可能な限り迅速にデータを収集しています。これらをできるだけ早く保管する必要があるため、フラットテーブルです。データはSQLServer、つまりデータベースから直接アクセスできる必要があります(SQL Compactとtable-directを使用しています)。

したがって、今のところ、適切なデータベース設計や正規化のルールなどについて学んだことはすべて忘れて、1000列のテーブルがあり、データを表示できるようにしたいという事実に焦点を当てましょう。画面にデータが実際に入力されていることを確認します。

データグリッドを試しました。(当然のことながら)それはそれほど多くの列を処理するように設計されていないので、それは吐き出します。

Studioでビューアを使用してみました。256を超えると、エンドユーザーはStudioをインストールしなくなります。

今のところ、結果はきれいである必要はなく、更新可能である必要も、データの変更に敏感である必要もありません。特定の時点でのテーブル内のデータの静的スナップショットだけです。

関連する(または半関連する)情報:

  • テーブルには1000列あります(クリックして満足する前に上記をお読みください)
  • SQLCompactバージョン3.5の使用
  • デスクトップで実行
  • マネージコードの答えを探しています
4

21 に答える 21

15

独自のカスタム ユーザー コントロールを実装する場合は、Fisheye Grid を次のように実行できます。

死んだ画像リンク

この例では、フルサイズの 3x4 パネルが 9x10 のテーブル内を移動しています。このデータを編集する必要はないと思いますので、UI は、ユーザーがパネルをつかんでドラッグするだけのものにすることができます。あなたが本当に自虐的である場合、および/または自由な時間がたくさんある場合は、同じグリッドに複数の魚眼パネルを配置して、グリッドの 1 つまたは複数の領域を同時に比較することもできます。

更新: Silverlightにはこれらの 1 つがあるようです。並べ替え。

于 2008-11-06T05:24:42.563 に答える
14

すべての数値をスペースを含む 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
于 2008-11-06T02:21:19.627 に答える
12

OK、私にとって正しい答えであることが判明したのは、ReportViewer コントロールを使用することでしたが、MSDN に記載されている方法ではありませんでした。問題は、私は動的データを持っているため、動的レポートが必要であり、すべてのチュートリアルなどは、設計時にすべてを知っている余裕があると想定しているように見えるため、ウィザードをポイントアンドクリックできます。

ソリューションには、いくつかの部品が必要になりました。まず、ReportViewer がレポート レイアウトと、どのデータ フィールドが何にマップされるかを記述するために使用する RDLC を動的に生成するコードを作成する必要がありました。これは私が思いついたものです:

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;
  }
}

2 番目の部分は、 Dan Shipe のブログから直接引用した XSL ファイルです。そこにある RDLC コードは、すべて Web での使用を目的としていたため、まったく価値がありませんでしたが、XSL は純金です。ブログがオフラインになった場合に備えて、完全を期すために、この記事の最後に記載しました。

これら 2 つの部分を取得したら、ReportViewer コントロールを含む Form を作成し、次のコードを使用して設定するだけです。

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」が、表示されるデータを含む単一の DataTable を持つ DataSet オブジェクトであることです。

もう一度、完全を期すために、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>
于 2008-11-06T22:28:11.030 に答える
6

データをcsvファイルに保存すると、表示のオプションが得られます。ユーザーが Excel または Open Office Calc を使用している場合、データを簡単にインポートして (Calc に列制限があるかどうかはわかりませんが、Excel 2007 では 16384 列を保持できます)、そのプログラムで表示できますか?

于 2008-11-05T23:35:05.420 に答える
3

1 つのテーブルで複数の行を表示する必要がありますか?

私の推測では、このデータは数値であると思います。単一行のデータを 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 |
于 2008-11-05T23:24:43.337 に答える
2

非常に小さなフォントのHTMLテーブルを試してください

テーブルのフォーマットが心配な場合は、CSSを使用してください。

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

または、すべての数字が同じサイズの場合は、「数字の壁」表示を生成することもできます。たとえば、固定幅フォントを使用して、スクロールパネルに5文字幅の列を表示します。

于 2008-11-05T23:14:57.007 に答える
1

それは、どれだけきれいにする必要があるかによって少し異なります。これが単なるデバッグ/スポット チェック ツールである場合は、複数の DataGrid を並べて配置し、それぞれに列の選択を表示することができます。ちょっと醜いでしょうが、実行可能です。

OTOH、半研磨ツールが必要な場合は、それを処理するためのカスタム コントロールを作成することをお勧めします。基本的には、表示されているデータベースのセクションを少しのバッファでロードし、ユーザーが現在ロードされているデータからスクロールしたときに、新しいクエリを実行します。

于 2008-11-05T23:36:38.787 に答える
1

DataGrid (または ListView) は、32 列と 32 行のテーブルを処理できる必要があります。これにより、DB 行全体のデータを一度に表示できます。これにより、一部のセルにデータが欠落しているかどうかを即座に確認できます。

于 2008-11-05T23:55:52.320 に答える
0

とにかくユーザーが水平方向にスクロールする必要があることを考えると、適切な数の列(たとえば、50)を表示する通常のデータグリッドを使用できます。次に、表示する列のサブセットを選択する水平スクロールバーをグリッドの下に配置します。スクロールバーが左側にある場合は1〜50列を表示し、右矢印をクリックすると2〜51に移動します。

これにより、グリッドコントロールにデータをオーバーロードすることなく、スクロール機能を利用できます。テーブル内を自由にカーソルを移動したり、大きな長方形を選択したりすることはできなくなりますが、このアプリケーションでは問題にならないようです。

于 2010-06-23T07:26:28.800 に答える
0

これを提案しても汚い気がしますが、次のようなことをすることができます。

SELECT Field1 + ' - ' + Field2 + ... AS EvilMegaColumn FROM Table

しかし、実際には、これは「この制限に直面している場合は、何か間違ったことをしている」というカテゴリに分類されると思います。1000列が必要な理由や速度などは本当にわかりません...

于 2008-11-05T23:16:57.517 に答える
0

これをドリルダウンにします。最初のページ (またはページの上部) には、行を選択するコントロールがあります。次のページ (またはページの下部) で、選択した行のデータを表示します。必要なセル幅に応じて、たとえば、これを 10 列× 100 行、または 1 列× 1000 行として行うことができます。

これは、動的なクライアント側の JavaScript として行うのはかなり簡単です。この方法で編集可能にすることもできます。これが C# でどのように機能するかはわかりません。

于 2008-11-05T23:29:10.363 に答える
0

検証の直後であれば、各フィールドをプログラムでチェックして、行全体が問題ないと報告することはできません!. 次に、あまり良くない行をリストする非常に単純なデータ グリッドが必要です。

ほとんどの場合、フィールドを参照する必要がないため、単一の行に適用できる任意の手法でそれらを調べることができます。ここでは、すでに何らかの方法で行全体を表示でき、複数の行を同時に参照して欠落しているデータを探す方法を探していると仮定しています (これを自動化すると、信頼性が大幅に向上します)。

于 2008-11-05T23:35:40.333 に答える
0

斜めの角度から見て、ユーザーが一度にすべての列を「ロード」する必要があるかどうかを尋ねますか?

ユーザーが一度に表示される列のサブセット (たとえば、一度に 100 個、または一度に特定のセット) を喜んで使用する場合は、ある種のデータ グリッド (組み込みのもの、またはListView、またはおそらくサードパーティのもの) を使用してサブセットを表示し、CheckedListView を横にドッキングして、関心のあるサブセットを表示できるようにします。

または、100 列のグループのカウント/平均/xxx を示す何らかの要約データを表示できますか?

于 2008-11-05T23:36:30.800 に答える
0

1000列のテーブルを読むのは誰ですか??? データをフィルタリングまたは視覚化する方法を考えてみてください。

于 2008-11-05T23:24:31.387 に答える
0

おそらく、別のタイプのデータベースを調査する必要があります。列指向データベースはこの種の処理に適していると聞いたことがあります (通常の RDBMS は行指向ですが)。また、行が最初に挿入された後に行を更新するために戻らない場合は、バイナリ フラット ファイルの方が巨大なテーブルよりも優れているのではないでしょうか?

于 2008-11-05T23:24:46.783 に答える
0

フラットレイアウト以外のものを調査することをお勧めします。私の経験では、データベースには列数と行のバイト サイズに制限があります。

  • SQL では、1000 列を定義できる場合があります。
  • SQL 行は、行のバイト制限を超えることはできません。

各データベースの実装にはページ サイズ (4k / 8k) があり、1 行がこのデータ サイズに収まる必要があります。通常、NULL は景品です。これは、1000 ints 1000 x 4 バイトが4k ページ サイズにちょうど収まることを意味します。

varchar を使用してデータを扱っている場合、問題はさらに悪化します。各列には何文字ありますか? 何列に入力できますか? 平均 10 文字で、ページ サイズが 8k の場合、SQL エラーでデータが失われます。

必要に応じて笑ってください。しかし、この状況は、限界を押し広げていることがわかっていたフラットなデータテーブルで、特に長々としたタイピストで発生しました。

于 2008-11-06T05:43:00.513 に答える
-1

データが入力されていることを確認するだけでよい場合は、すべての列に「無効」、「空白」などのデフォルト値を設定しないでください。

次に、デフォルト以外/合計を数えながら反復してパーセンテージを表示できます。

データの完全性をパーセンテージ値で視覚化できるようになりました。詳細な調査のために、どの列にデフォルト値があったか (リスト/配列など) を記録することもできます。

于 2008-11-05T23:39:31.167 に答える
-1

ユーザーベースをチェックして、彼らが実際に見る必要があるものを確認してから、列のカウントダウンを取得するために、個別のニーズごとにビューを設定することを検討してください。

もう 1 つのオプションは、データを読み取り、そこから非常に大きな静的な HTML ページのセットを作成することです。次に、プログラム内からブラウザを呼び出して表示できます。

于 2008-11-05T23:59:53.530 に答える
-1

スクロール可能なペインを用意し、一度に 10 列を表示します (これらはアクティブにロードまたはキャッシュするか、必要なものを何でもかまいません)。左にスクロールすると、最初の 10 個が表示されます。右にスクロールすると、列の最後のシーケンスが表示されます。したがって、全体として、任意の時点でアクティブな列は 10 列だけです。私の意見では、実際に1000列を表示しようとするのは、他の方法では難しいでしょう。PS: これは理想的な推測にすぎません。それがリモートで可能かどうかはよくわかりません。

于 2008-11-06T02:30:24.100 に答える
-1

初期ビューにとって重要なデータはどれくらいですか? 重要な列 (10 など) をデータグリッドに配置しているマスター/詳細タイプのグリッドのようなことを行っていることがわかります。ユーザーがクリックして詳細を表示すると、残りの列を取得して "プロパティ領域」またはその点に関する何か。

于 2008-11-05T23:23:43.400 に答える