質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

IDの非表示での値を取得

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,269

KUMAO

score 18

こんばんは。質問です
GridViewにIDを表示しているのですがこれを非表示にして値が取れるようにしたいのですがやり方が調べてもわかりません。

    public partial class ToDo_control : System.Web.UI.Page
    {   
        protected void Page_Load(object sender, EventArgs e)
        {  
            if (!IsPostBack)
            {

                mitilyakusilu.Checked = true;

                sikakari.Checked = true;

                kanrilyou.Checked = true;

                Dictionary<string, string> item = new Dictionary<string, string>();
                item["C01"] = "打合わせ";
                item["C02"] = "資料作成";
                item["C03"] = "プログラム";
                item["C04"] = "テスト";
                item["C05"] = "その他";
                item["C06"] = "プライベート";

                Ddl.DataSource = item;
                Ddl.DataTextField = "Value";
                Ddl.DataValueField = "Key";
                Ddl.DataBind();
                Ddl.Items.Insert(0, "");


                DataTable dt = new DataTable();
                //空の DataTableを作成
                dt.Columns.Add("Id", typeof(String));
                dt.Columns.Add("Staus", typeof(String));
                dt.Columns.Add("CategoryCode", typeof(String));
                dt.Columns.Add("StartDate", typeof(String));
                dt.Columns.Add("EndDate", typeof(String));
                dt.Columns.Add("ToDo", typeof(String));
                GridView.DataSource = dt;
                GridView.DataBind();
            }
        }

        protected void Registration_Click(object sender, EventArgs e)
        {
            Response.Redirect("ToDo_Editing.aspx");
        }

        protected void Editing_Click(object sender, EventArgs e)
        {
            Response.Redirect("ToDo_Editing.aspx");
        }

        protected void search_Click(object sender, EventArgs e)
        {
            string connectionString = ConfigurationManager.ConnectionStrings["SQLServer"].ConnectionString;

            using (var connection = new SqlConnection(connectionString))
            using (var command = connection.CreateCommand())
            {
                try
                {

                    //データベースの接続開始
                    connection.Open();

                    //実行するSQLの準備
                    String sql = @"SELECT ID,Status,CategoryCode,Code,Name,ToDo,StartDate,EndDate,
                                                                             Checked = CASE Status
                                                                WHEN '1' THEN '未着手'
                                                                WHEN '2' THEN '仕掛'
                                                                WHEN '3' THEN '完了'
                                                              END  
                                                                FROM ToDoYamamoto INNER JOIN CategoryYamamoto
                                                                ON ToDoYamamoto.CategoryCode = CategoryYamamoto.Code 
                                                                                                        WHERE 1 = 1";
                    //未着手のチェックボックスにチェックが入っているか
                    bool flg = true;
                    if (mitilyakusilu.Checked)
                    {
                        sql = sql + " AND Status = '1' ";
                        flg = false;
                    }

                    //仕掛のチェックボックスにチェックが入っているとき
                    if (sikakari.Checked)
                    {

                        if(flg == true)
                        {
                            sql += " AND";
                        }
                        else
                        {
                            sql += " OR";
                        }
                        sql += " Status = '2'";
                        flg = false;
                    }

                    //完了のチェックボックスにチェックが入っているとき
                    if (kanrilyou.Checked)
                    {

                        if(flg == true)
                        {
                            sql += " AND";
                        }
                        else
                        {
                            sql += " OR";
                        }
                        sql += " Status = '3'";
                        flg = false;
                    }

                    //カテゴリが選択されているとき
                    if (Ddl.SelectedValue != "")
                    {
                        sql = sql + " AND CategoryCode = @CategoryCode";
                        command.Parameters.Add(new SqlParameter("@CategoryCode", Ddl.SelectedValue));
                    }

                    //開始予定日が入力されているとき
                    if (StartFrom.Text != "")
                    {
                        sql = sql + " AND StartDate >= @StartFrom";
                        command.Parameters.Add(new SqlParameter("@StartFrom", StartFrom.Text));
                    }

                    //開始予定日が入力されているとき
                    if (StartTo.Text != "")
                    {
                        sql = sql + " AND StartDate <= @StartTo";
                        command.Parameters.Add(new SqlParameter("@StartTo", StartTo.Text));
                    }

                    //完了予定日が入力されているとき
                    if (CompletionFrom.Text != "")
                    {
                        sql = sql + " AND EndDate >= @CompletionFrom";
                        command.Parameters.Add(new SqlParameter("@CompletionFrom", CompletionFrom.Text));
                    }

                    //完了予定日が入力されているとき
                    if (CompletionTo.Text != "")
                    {
                        sql = sql + " AND EndDate<= @CompletionTo";
                        command.Parameters.Add(new SqlParameter("@CompletionTo", CompletionFrom.Text));
                    }

                    sql = sql + " ORDER BY Status, CategoryCode, StartDate, EndDate, ToDo";
                    //実行
                    command.CommandText = sql;


                    var adapter = new SqlDataAdapter(command);

                    //取得結果を格納する
                    var table = new DataTable();

                    //データの取得
                    adapter.Fill(table);

                    GridView.DataSource = table;
                    GridView.DataBind();
                }

                finally
                {
                    //データベースの接続終了
                    connection.Close();
                }
            }
        }

    }
}
コード
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • KUMAO

    2017/06/27 22:24

    すみません、今回は質問を取り下げ考えがまとまってからまた質問しようと思います。

    キャンセル

  • SurferOnWww

    2017/06/27 22:34

    ここまで回答者・閲覧者に考えさせておいて質問を取り下げようというのですか? 回答者・閲覧者があなたの質問を考えるのに費やした労力をどう思っているのですか?

    キャンセル

  • KUMAO

    2017/06/28 06:52

    本当に、申し訳ございません

    キャンセル

回答 2

checkベストアンサー

+2

上の私とのやり取りから今回質問者さんがやりたいことをまとめると、

(1) SQL Server のテーブルで ID は int 型 IDENTITY の主キー。
(2) ID は GridView に表示したくない。
(3) ID がないと Update, Delete ができないという懸念がある。
(4) DB の編集・更新を別画面に遷移して行いたい。

・・・ということでいいのですよね。

で、質問者さんが質問にアップされたコードのように、DataTable を作って GridView.DataSource に設定し GridView.DataBind() したのでは、

(a) ID が自動的に表示されてしまう。
(b) と言って、SELECT クエリから ID を削除しては (4)ができなくなってしまう。

・・・ので、それを解決するのが課題だと理解しています。

上記 (a) については、GridView の AutoGenerateColumns プロパティを "False" に設定(デフォルトで true)、DataKeyNames プロパティに "ID" を設定、DataControlFieldCollection に表示するフィールドの分のみ BoundField を設定すれば可能なはずです。

それらは自力でコードを書かなくても、データソースコントロール(SqlDataSource, ObjectDataSource など)と組み合わせて Visual Studio のウィザードを使えばすべて自動生成されます。

以下の例は、Microsoft のサンプルデータベース Northwind の Products テーブルをベースに作った GridView のソースで、100% 完全なものをウィザードが自動生成してくれます。コードは自分では一行も書いてません。

<asp:GridView ID="GridView1" runat="server" 
    AutoGenerateColumns="False" 
    DataKeyNames="ProductID" 
    DataSourceID="SqlDataSource1">
    <Columns>
        <asp:BoundField DataField="ProductID" 
            HeaderText="ProductID" 
            InsertVisible="False" ReadOnly="True" 
            SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName" 
            HeaderText="ProductName" 
            SortExpression="ProductName" />
        <asp:BoundField DataField="SupplierID" 
            HeaderText="SupplierID" 
            SortExpression="SupplierID" />
        <asp:BoundField DataField="CategoryID" 
            HeaderText="CategoryID" 
            SortExpression="CategoryID" />
        <asp:BoundField DataField="QuantityPerUnit" 
            HeaderText="QuantityPerUnit" 
            SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice" 
            HeaderText="UnitPrice" 
            SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock" 
            HeaderText="UnitsInStock" 
            SortExpression="UnitsInStock" />
        <asp:BoundField DataField="UnitsOnOrder" 
            HeaderText="UnitsOnOrder" 
            SortExpression="UnitsOnOrder" />
        <asp:BoundField DataField="ReorderLevel" 
            HeaderText="ReorderLevel" 
            SortExpression="ReorderLevel" />
        <asp:CheckBoxField DataField="Discontinued" 
            HeaderText="Discontinued" 
            SortExpression="Discontinued" />
    </Columns>
</asp:GridView>

上記コードで、質問者さんのケースで ID に相当するのは ProductID ですが、それを表示しないようにするには当該 BoundField を削除します。それで課題 (a) は解決です。

(だから、質問者さんの先のスレッドでデータソースコントロールを使うようアドバイスしたのですが・・・無視されたようで残念)

さらに「(4) 編集・更新は別画面に遷移して行いたい」を行うための追加が必要ですが、具体的にどうしたいのか聞いても返事がないので、GridView 上で編集する行を選択し、そのイベントで別画面にリダイレクトすると勝手に想像して・・・

まず、GridView の Columns に以下のような CommandField を追加します。(これもウィザードでできます)

<asp:CommandField ShowSelectButton="True" />

さらに、GridView.SelectedIndexChanged イベントのハンドラを追加して(これもウィザードでできます)、その中に Response.Redirect メソッドを記述して(これのみ自力でコードを書く必要があります)編集・更新用の別画面に遷移すればいいです。

その際、編集するレコードの ID を別画面に渡してやらないと何ともなりませんが、ID は SelectedValue プロパティから取得できるので(DataKeyNames="ID" と設定してあれば取得できるはず)、クエリ文字列などを利用して渡してやればいいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/28 19:05

    この度は不快な思いをさせてしまいすみませんでした。

    キャンセル

  • 2017/06/28 19:30

    謝っていただく必要はありません。それより、この回答に対する質問(もしあれば)、質問者さんの課題が解決できたかどうか、解決できてない場合は何が問題かを書いてください。

    キャンセル

  • 2017/07/01 06:57

    無事に解決することが出来ました!ありがとうございます。

    キャンセル

0

もちっと今なにをやっているか、やろうとしているかを理解しながらコードを書くようにした方がいいですね
人間にうまく説明できないことをコンピュータにうまくやらせるとか、DeepLearningやってんじゃないんですから..

GridViewに

  • SelectedIndex
  • SelectedDataKey
  • SelectedRow
  • SelectedValue

がどうしてあるのか考えたことあります?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/28 10:32

    その前に ID 云々の話があるわけですから、まず AutoGenerateColumns, DataKeyNames プロパティを考える方が先になるはずです。質問者さんはもう出てこられないようなので何ですが、詳しくは回答欄に書いておきます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る