C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: GridViewの内容をDropDownLis


(過去ログ 34 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■17281 / inTopicNo.1)  GridViewの内容をDropDownListから絞り込む
  
□投稿者/ nk (1回)-(2008/04/21(Mon) 17:03:47)

分類:[ASP.NET (VB)] 

2008/04/21(Mon) 19:11:43 編集(投稿者)
今までは並べ替えでなんとか対処してきましたが、
データ量が増えるにつれ絞込み機能が欲しくなってきました。

GridViewの内容を、DropDownListで指定したユーザ名によって絞込む
(実際に絞り込むのは対応しているユーザID)
というものを作りたいと思っています。

http://jsajax.com/aspGridView/Toc.aspx
こちらの「DropDownListと連動」を参考に試みましたが、
何故かGridViewが表示されないという事態に。


若干簡素化しましたが、以下ソースです。

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <table>
        <tr>
            <td><span>ファイル一覧</span>
            </td>
        </tr>
        <tr>
			<td>
                    <asp:DropDownList ID="DropDownList1" runat="server" AppendDataBoundItems="True"
                        AutoPostBack="True" DataSourceID="SqlDataSource1" DataTextField="UserName"
                        DataValueField="UserId">
                        <asp:ListItem>ユーザIDで絞込み</asp:ListItem>
                    </asp:DropDownList>
                    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                        ConnectionString="<%$ ConnectionStrings:LSStest %>"
                        OldValuesParameterFormatString="original_{0}" SelectCommand="SELECT UserId, UserName FROM aspnet_Users" ProviderName="System.Data.SqlClient">
                    </asp:SqlDataSource>
                    <br />
                    <asp:GridView ID="GridView1" runat="server" AllowPaging="True"
                        AutoGenerateColumns="False" DataKeyNames="管理No." DataSourceID="SqlDataSource2">
                        <Columns>
                            <asp:BoundField DataField="管理No." HeaderText="管理No." ReadOnly="True" SortExpression="管理No." />
                            <asp:BoundField DataField="UserId" HeaderText="UserId" SortExpression="UserId" />
                            <asp:BoundField DataField="ファイル名" HeaderText="ファイル名" SortExpression="ファイル名" />
                            <asp:BoundField DataField="コメント" HeaderText="コメント" SortExpression="コメント" />
                        </Columns>
                    </asp:GridView>
                    <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:LSStest %>"
                        ProviderName="System.Data.SqlClient" SelectCommand="SELECT [管理No.], [UserId], [ファイル名],[コメント]FROM [ファイル管理] WHERE ([UserId] = @UserId)">
                        <SelectParameters>
                            <asp:ControlParameter ControlID="DropDownList1" Name="UserId" PropertyName="SelectedValue" Type="Object" />
                        </SelectParameters>
                    </asp:SqlDataSource>
			</td>
        </tr>
    </table>
</asp:Content>


何かお気づきの方は一言いただけますか。
ちなみに、UserIdはuniqueidentifierです。

※一部ソース訂正しました。


引用返信 編集キー/
■17294 / inTopicNo.2)  Re[1]: GridViewの内容をDropDownListから絞り込む
□投稿者/ ネタ好き (132回)-(2008/04/21(Mon) 18:32:23)
No17281 (nk さん) に返信
ユーザIDを使用して、表示するデータを絞っているようには見えない。
そこは省略したのでしょうか?
引用返信 編集キー/
■17296 / inTopicNo.3)  Re[2]: GridViewの内容をDropDownListから絞り込む
□投稿者/ nk (2回)-(2008/04/21(Mon) 19:09:51)
No17294 (ネタ好き さん) に返信
> ■No17281 (nk さん) に返信
> ユーザIDを使用して、表示するデータを絞っているようには見えない。
> そこは省略したのでしょうか?

え。
もちろんそこは省略していないつもりでいました。

<SelectParameters>の部分でDropDownListの中身を変数にして
SqlDataSource2<Selectcommand>のWHERE ([UserId] = @UserId)
で絞り込めているつもりだったのですが
ただの勉強不足でしょうか、申し訳ないです

引用返信 編集キー/
■17300 / inTopicNo.4)  Re[1]: GridViewの内容をDropDownListから絞り込む
□投稿者/ いしだ (104回)-(2008/04/21(Mon) 20:07:39)
2008/04/21(Mon) 20:20:59 編集(投稿者)
Insertの場合は、Type="Object"をType="String"にすればうまくいくようです。

Selectの場合はちょっと強引なんですが、DropDownListのSelectedIndexChangedイベントで、
以下のようにSelectCommandを指定するという方法があります。

SqlDataSource2.SelectCommand = "SELECT [管理No.],[UserId],[ファイル名],[コメント] FROM [ファイル管理]";
if (DropDownList1.SelectedIndex != 0)
{
  SqlDataSource2.SelectCommand += " WHERE [UserId] = '" + DropDownList1.SelectedValue + "'";
}

で、aspxの方のSqlDataSourceには
SelectCommand="SELECT [管理No.],[UserId],[ファイル名],[コメント] FROM [ファイル管理]"
って感じで設定しておいてください。

動作未検証です。
やり方が良いかどうかはわかりません。。。
どなたか、フォローお願いします。

引用返信 編集キー/
■17307 / inTopicNo.5)  Re[2]: GridViewの内容をDropDownListから絞り込む
□投稿者/ ネタ好き (133回)-(2008/04/21(Mon) 23:26:52)
済みません。私が見逃していました。
引用返信 編集キー/
■17308 / inTopicNo.6)  Re[3]: GridViewの内容をDropDownListから絞り込む
□投稿者/ ネタ好き (134回)-(2008/04/21(Mon) 23:47:49)
既に知っているかもしれませんが、一応言っておきます。
SQLの直書きは大変危険です。
SqlCommandとSqlParameterを駆使した方がいいです。
引用返信 編集キー/
■17309 / inTopicNo.7)  Re[4]: GridViewの内容をDropDownLis
□投稿者/ いしだ (105回)-(2008/04/22(Tue) 00:08:02)
2008/04/22(Tue) 00:10:11 編集(投稿者)

> SQLの直書きは大変危険です。
> SqlCommandとSqlParameterを駆使した方がいいです。
この場合の、SqlCommandとSqlParameterを駆使した例はどんな感じでしょうか?
UserIdがuniqueidentifierなので、SqlCommandでうまく指定出来ないのです
(SqlDataSourceのバグなのか仕様なのか?)。
SessionとStoredProcedureを使用すれば、ネタ好きさんの言うように出来るんじゃな
いかと思っているのですが。。。

SQLインジェクションの問題は、この例の場合、DropDownList1はユーザが値を
指定できるものでは無いので、まあ許容範囲かな、と思っています。
引用返信 編集キー/
■17310 / inTopicNo.8)  Re[5]: GridViewの内容をDropDownLis
□投稿者/ ネタ好き (135回)-(2008/04/22(Tue) 00:26:50)
No17309 (いしだ さん) に返信
> 2008/04/22(Tue) 00:10:11 編集(投稿者)
>
>>SQLの直書きは大変危険です。
>>SqlCommandとSqlParameterを駆使した方がいいです。
> この場合の、SqlCommandとSqlParameterを駆使した例はどんな感じでしょうか?
> UserIdがuniqueidentifierなので、SqlCommandでうまく指定出来ないのです
> (SqlDataSourceのバグなのか仕様なのか?)。
> SessionとStoredProcedureを使用すれば、ネタ好きさんの言うように出来るんじゃな
> いかと思っているのですが。。。
>
> SQLインジェクションの問題は、この例の場合、DropDownList1はユーザが値を
> 指定できるものでは無いので、まあ許容範囲かな、と思っています。

例えば・・・
SqlCommand cmd = cn,CreateCommand();
cmd.CommandText = "SELECT [管理No.],[UserId],[ファイル名],[コメント] FROM Table WHERE UserId = @UserID";
cmd.Paramters.Add("@UserID", SqlDbType.UniqueIdentifier);

引用返信 編集キー/
■17311 / inTopicNo.9)  Re[6]: GridViewの内容をDropDownLis
□投稿者/ いしだ (106回)-(2008/04/22(Tue) 00:38:42)
> 例えば・・・
> SqlCommand cmd = cn,CreateCommand();
> cmd.CommandText = "SELECT [管理No.],[UserId],[ファイル名],[コメント] FROM Table WHERE UserId = @UserID";
> cmd.Paramters.Add("@UserID", SqlDbType.UniqueIdentifier);
>
ああ、その実装方法ですか。。。
質問者さんの実装方法のパターンで、なんかうまくできるのかと思ったのですが。

要するに、aspxにSQLを埋めるのは良くない、という事でしょうか?


引用返信 編集キー/
■17313 / inTopicNo.10)  Re[7]: GridViewの内容をDropDownLis
□投稿者/ ネタ好き (136回)-(2008/04/22(Tue) 01:12:59)
2008/04/22(Tue) 01:17:23 編集(投稿者)

No17311 (いしだ さん) に返信
>>例えば・・・
>>SqlCommand cmd = cn,CreateCommand();
>>cmd.CommandText = "SELECT [管理No.],[UserId],[ファイル名],[コメント] FROM Table WHERE UserId = @UserID";
>>cmd.Paramters.Add("@UserID", SqlDbType.UniqueIdentifier);
>>
> ああ、その実装方法ですか。。。
> 質問者さんの実装方法のパターンで、なんかうまくできるのかと思ったのですが。
>
> 要するに、aspxにSQLを埋めるのは良くない、という事でしょうか?
>

その通りです。直接書くと(文字列連結では)色々な攻撃が出来てしまいます。
攻撃手段は倫理的にいえませんが、非常に危険です。
引用返信 編集キー/
■17324 / inTopicNo.11)  Re[8]: GridViewの内容をDropDownLis
□投稿者/ いしだ (107回)-(2008/04/22(Tue) 10:12:04)
2008/04/22(Tue) 10:17:30 編集(投稿者)

> その通りです。直接書くと(文字列連結では)色々な攻撃が出来てしまいます。
> 攻撃手段は倫理的にいえませんが、非常に危険です。
>
今回の場合、aspxにSQL文を書いてもクライアントブラウザからは見えませんよね
(ソースの表示をしても)。

今回ユーザーは、「TextBoxに値を設定」するのではなく「DropDownListの選択」
ですが、#17300のソースにどのような危険が潜んでいると考えられますか?
この場合でも何とかすれば、SQL文に細工したりする事が出来たりするのでしょうか?
そうであれば、考えを改めないといけないですね。

一般的には、ネタ好きさんのように書くのが無難で、私も普段はそうしていますが、
今回はそれが出来ない為(SqlDataSourceコントロールのバグ?)、#17300の方法
をとったわけです。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -