1

目標 私が必要としているのは、ASP.NET を介して Web ページでユーザーに SQL DataTable を表示し、ユーザーが多数の行を非常に迅速かつ簡単に選択できるようにし、多数の異なるボタンのいずれかを押してさまざまな操作を示すことです。選択された行は、処理のために送信されます (通常、分離コードを介して Web サービスなどに送信されます)。多くの場所でこの同じセットアップを使用するため、これはやや一般的なソリューションです。したがって、データと利用可能な操作は異なります。

目標は、データについて基本的に何も知ることができないようにすることです。つまり、ユーザーが理解できるようにすることです。この概念が既に不可能である場合 (私はそうではないと思いますが)、私に知らせてください。

T-SQL からのプル (SQL Server 2008 R2 以降)。ASP.NET を使用して aspx Web ページを作成します。コードビハインドは VB.NET で行われ、どちらの場合も 4.0 を使用しています。私は C# と VC++ に堪能なので、コードを簡単に翻訳できない場合でも、心配する必要はありません。

問題 私の問題は、テーブルの並べ替えまたはページング中に持続し、ユーザーにとって迅速で、応答時間が比較的速く、GridView のバインドされたデータに反映される、ユーザー用の行選択プロセスを作成することです (これにより、 DataView でフィルターを使用して、渡すための DataTable を生成します)。選択された行を知る別の方法があれば、それが永続的でユーザーにとって迅速である限り、私はすべてゲームです。

私はデバッグしておらず、構文の問題もありません (信じられません) - どうすればよいかわかりません。解決策として必ずしもコードが必要なわけではありません。私のメタファーが悪い習慣なのか、単に一般的でないために十分にサポートされていないのかを理解する必要があります。どちらの場合でも、どのように進めるのが適切ですか?他に何もないとしても、無限の API とチュートリアル以外にどこで解決策を探すことができますか?

私の当初の計画 では、列を自動生成できるため、TSQL から取得した DataTable をバインドするために asp:GridView を使用したいと考えていました。これにより、データが何であるかを知らなくてもデータを表示できます。ユーザーの行選択を保存するために、特定のブール列 (一番左) を追加する予定でした。次に、単純に DataTable に対してフィルターを実行して DataView を生成し、その DataView から結果の DataTable を取得して、それをチェーンに渡します。

特定の選択項目を除くすべての列は読み取り専用になります。ユーザーはデータを編集していません。レコードを選択し、表示可能な関連データと並べて選択を表示します。

注目すべきは、追加した列が DataTable の既存の列と衝突しないように名前の衝突をチェックすることでした。必要に応じて増加する他の列。

これを設定すると、それ自体が処理されると思いました。ユーザーは結果のチェックボックス列のセルをクリックすると、その場でデータが変更されます。選択を保存するポイントは、便宜上、並べ替えとページングによって選択が保持されることでした (GridView の DataSource を保存し、必要に応じて再バインドします)。ユーザーがページを更新して完全にチェックボックスを失ったとしても、実際には問題ではありませんでした。変更や新しいデータを確認する必要があり、必要なものをチェックするのに少しの時間以上は必要ありません。

これは起こりませんでした。

AutoGenerateColumns がブール型 DataColumns のチェックボックスを生成しないことがわかりました。テキストが生成されるため、「True」または「False」という単語になります。

ブール値の DataColumn のセルにチェック ボックスを表示する方法を探し始めました。追加されたブール列については、属性 DataField を使用して asp:CheckBoxField をバインドできることがわかりました。もちろん、変数 DataField をポイントする方法を理解する必要があります...

<Columns>
  <asp:CheckBoxField DataField="Select" HeaderText="Select" 
   ReadOnly="False" SortExpression="Select">
    <ItemStyle HorizontalAlign="Center" />
  </asp:CheckBoxField>
</Columns>

ただし、GridView は行ごとの編集用に設計されているため、結果として得られるすべての CheckBoxes は無効になり、チェックできません。これは、それらを含む行が Edit Mdoe にないためです。ユーザーは多くの場合、複数の行をチェックする必要があるため、ボタンまたは同様のメタファーを使用して行ごとの編集を有効にしたくありません。より多くのクリックは良くなく、迷惑です。編集モードの開始と終了を忘れずに、データと選択にのみ集中する必要があります。また、チェックボックスは唯一の編集可能なデータであり、表現されたデータの一部ではないため、メタファーはここでは不適切に配置されているようです。

もちろん、GridView から継承する新しいクラスを作成し、列を生成してテキスト フィールドではなくチェックボックスを生成するメソッドをオーバーロードすることもできますが、もっと簡単な方法が必要だと感じました。多分これは行く方法ですか?しかし、おそらく上記と同じ編集の問題があるでしょう - 私にはわかりません.

そこで、次に、asp:TemplateField を GridView の列として使用してみました。この TemplateField には asp:CheckBox が含まれており、Checked 状態は基になるバインドされたデータ値に基づいています。ここでの問題は、チェック状態の更新を変更して、バインドされた値を更新しようとしていることです。DataTable で同じ行を検索するために使用できる GridView 値を検索する何らかの方法が必要です。主キーを使用した素晴らしい例を見てきました。誰もが可能なテーブルの主キーを保持していると思いますが、そうではないかもしれません! 自分で主キーをさらに追加することもできますが、DataTable を WebService に 1 つではなく渡す前に、2 つの列を追加および削除するように見えます。繰り返しますが、衝突を避けるために動的な列名を割り当てることもできる必要があります。

<asp:TemplateField HeaderText="Select">
    <ItemTemplate>
      <asp:CheckBox runat="server" ID="CheckBox" 
       Checked="<%# DataBinder.Eval(Container.DataItem, "Select") %>" 
       AutoPostBack="true" OnCheckedChanged="SelectCheckBox_CheckChanged" />
      </ItemTemplate>
</asp:TemplateField>

私は自分自身を止めました-この道もかなり間接的です。確かに、これを行うためのはるかにクリーンで簡単な方法があります。処理/更新/変更のために何らかの方法で送信するレコードが選択されている場合に、読み取り専用データを表示することは一般的ですか?

私の選択した GridView は貧弱ですか? テーブルデータを表現する別の良い方法をまだ見つけていません。

4

0 に答える 0