none
データベースから取得したデータにリンクを追加するには? RRS feed

  • 質問

  • 現在、データベースからDataSetに取得したデータに対して、リンクのカラムを追加したいと考えています。

    しかし、方法が解りません。

    現在、下記のコードでDataSetの内容をGridViewに表示し、カラムの追加は出来たのですが、

    リンクの箇所が「<a href=aaa.aspx>詳細</a>」と表示されてしまいます。

    どのようにすればリンクが実現できるのでしょうか?

     開発環境はVS2005 Webフォームです。

    protected void Button1_Click(object sender, EventArgs e)
    {
     ~データベース設定(省略)~
     
     sqlConn.Open();
     DataSet dtSet = new DataSet("DataTbl");
     sqlDa.Fill(dtSet, "DataTbl");
     sqlConn.Close();

     // DataGridViewにデータを表示
     if (dtSet.Tables.Count > 0)
     {
      ~ここでdtSetにリンクカラムの追加したい~
       DataColumn colLink = new DataColumn();
       colLink.ColumnName = "表示";
       colLink.DataType = typeof(String);

       dtSet.Tables["DataTbl"].Columns.Add(colLink);
       dtSet.Tables["DataTbl"].Rows[0]["表示"] = "<a href=aaa.aspx>詳細</a>";  

      // GridViewに表示
      GridView1.DataMember = dtSet.Tables[0].TableName;
      GridView1.DataSource = dtSet;
      GridView1.DataBind();   
     }
    }

     

    2010年7月28日 4:55

回答

すべての返信

  • HtmlEncode プロパティをfalseにしてみて下さい。

    BoundField.HtmlEncode プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.boundfield.htmlencode.aspx


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク 2tom 2010年7月29日 2:14
    2010年7月28日 7:00
    モデレータ
  • 昔、別のスレッドの検証用に作ったサンプルですが、以下が参考になりませんか?

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Data" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
        DataTable CreateDataTable()
        {
            DataTable dt = new DataTable();
            DataRow dr;

            dt.Columns.Add(new DataColumn("Code", typeof(Int32)));
            dt.Columns.Add(new DataColumn("Name", typeof(string)));
            dt.Columns.Add(new DataColumn("Price", typeof(Int32)));

            for (int i = 0; i < 10; i++)
            {
                dr = dt.NewRow();
                dr["Code"] = i;
                dr["Name"] = "日本語 " + i.ToString();
                dr["Price"] = 123000 * (i + 1);
                dt.Rows.Add(dr);
            }
            return dt;
        }

        void Page_Load(Object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                GridView1.DataSource = CreateDataTable();
                GridView1.DataBind();
            }
        }

    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField DataField="Code" HeaderText="ID" />
                    <asp:BoundField DataField="Name" HeaderText="名前" />
                    <asp:BoundField DataField="Price" HeaderText="価格" />
                    <asp:TemplateField HeaderText="HyperLink">
                        <ItemTemplate>
                            <asp:HyperLink ID="HyperLink1"
                                runat="server"
                                Text='<%# Eval("Name") %>'
                                NavigateUrl='<%# "~/default.aspx?keyword=" + Server.UrlEncode((string)Eval("Name")) %>'
                                Target="_blank" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
        </div>
        </form>
    </body>
    </html>

    2010年7月28日 13:50
  • 解答ありがとうございます。

    コード上での、HtmlEncodeプロパティの変更方法が解りませんでしたので別の方法にしました。

    (詳細は下記に記します。)

    解答頂いたのに、申し訳ございません。

    2010年7月29日 2:04
  • >SurferOnWww

    返答ありがとうございます。

    ****.aspxの<columns>内でHyperLinkを変更する方法もトライしましたが、

    GridView1.DataBind();  

    でエラーが発生しました。

    (GridView1.DataBind(); で表示データを設定しているため?)

    他の方法で解決しました。ありがとうございました。

    2010年7月29日 2:08
  • HyperLinkFieldをカラムに追加することで解決しました。

    以下、****.aspx.csのコードです。

     

     

    protected void Button1_Click(object sender, EventArgs e)
    {
     ~データベース設定(省略)~
     
     sqlConn.Open();
     DataSet dtSet = new DataSet("DataTbl");
     sqlDa.Fill(dtSet, "DataTbl");
     sqlConn.Close();

     // DataGridViewにデータを表示
     if (dtSet.Tables.Count > 0)
     {
       string[] dataNavigateUrlFields = { "ID" };
       
       HyperLinkField hyperLinkField = new HyperLinkField();
       hyperLinkField.HeaderText = "表示";
       hyperLinkField.Text = "詳細";
       hyperLinkField.DataNavigateUrlFields = dataNavigateUrlFields;
       hyperLinkField.DataNavigateUrlFormatString = "~/aaaa.aspx?ID={0}";

     

      // GridViewに表示
       GridView1.Columns.Add(hyperLinkField);
       GridView1.DataMember = dtSet.Tables[0].TableName;
       GridView1.DataSource = dtSet;
       GridView1.DataBind(); 
     }
    }

    皆様、ありがとうございました。

    2010年7月29日 2:13
  • > GridView1.DataBind(); 
    > でエラーが発生しました。

    そんなことはないはずですけど。そのままコピペすれば動くはずです。

    念のため、自分でもアップしたコードをコピペして、[デバッグなして開
    始(H)]または[デバッグ開始(S)]で動くことを確認しました。

    その通りやっていないのではないのですか。

    2010年7月29日 11:55
  • >SurferOnWww

    お教え頂いたコードはGridViewのカラムや、データはコード上で生成されているかと思いますが、

    今回私が行いたい処理はデータベース(SQL Server)の内容をそのまま、GridViewの表示する

    というものです。DBのカラム変更が行われた場合、コード上の変更は行わずに表示したいと考えております。

    カラム固定で行う場合は、お教え頂いたコードのfor文でデータの設定を行っている箇所をDBから読み出しで

    設定する方法に変更すればよろしいのでしょうか。

    以上、宜しくお願い致します。

    2010年8月4日 1:25
  • > カラム固定で行う場合は、お教え頂いたコードのfor文でデー
    > タの設定を行っている箇所をDBから読み出しで設定する方法
    > に変更すればよろしいのでしょうか。

    いえ違います。カラム固定/非固定と HyperLink へのデータバイ
    ンドは関係ない話です。

    サンプルコードをそのままコピペして動かしてみてください。ど
    のように設定されるか理解できると思います。そのために DB な
    しで動くようにしてあります。

    2010年8月4日 12:33