none
Mysqlで取得した行番号をリンクにしたい RRS feed

  • 質問

  • 下記ページを参考にしました。

    http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/865fc0b2-22c7-42a5-8a16-4c55937f9b53

    この部分です。

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

    列名を「番号」とし、行番号を表記してある所をリンクにしたいです。

    "~/aaaa.aspx?ID={0}"

    ここのように

    ただ、上記例だと番号の列が追加されるだけど既存のただのデータ列も残って二つ同じような

    列ができてしまいます。

    また、セルの内容が番号ではなくすべて「詳細」になってしまいます。

    番号を表示しリンクにするにはどうしたらよいのでしょうか?

    ご存知の方教えていただけましたら幸いです。

    2010年8月5日 10:06

回答

  • Text プロパティに文字列をセットしたら、すべてのセルでその文字列が使われてしまいます。DataTableの内容を使いたい場合は、DataTextFieldに列名をセットしてください。

    また、GridViewはデフォルトだと自動で列を生成します。勝手に列を追加してほしくない場合は、AutoGenerateColumnsプロパティをfalseにしてください。

    検証で使用した、簡単なサンプルコードを載せておきます。

    DataTable table = new DataTable("Test");
    table.Columns.Add("Id", typeof(int));
    table.Columns.Add("Name", typeof(string));
    table.Rows.Add(1, "Foo");
    table.Rows.Add(2, "Bar");
    
    GridView1.AutoGenerateColumns = false; // 自動で列が生成されるのをやめる
    GridView1.Columns.Add(new HyperLinkField()
    {
      HeaderText = "番号", // 列タイトル
      DataTextField = "Id", // 表示したい列の名前
      DataNavigateUrlFields = new string[]{ "Id"},
      DataNavigateUrlFormatString = "~/aaaa.aspx?ID={0}",
    });
    GridView1.DataSource = table;
    GridView1.DataBind();
    
    

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年8月5日 10:39

すべての返信

  • Text プロパティに文字列をセットしたら、すべてのセルでその文字列が使われてしまいます。DataTableの内容を使いたい場合は、DataTextFieldに列名をセットしてください。

    また、GridViewはデフォルトだと自動で列を生成します。勝手に列を追加してほしくない場合は、AutoGenerateColumnsプロパティをfalseにしてください。

    検証で使用した、簡単なサンプルコードを載せておきます。

    DataTable table = new DataTable("Test");
    table.Columns.Add("Id", typeof(int));
    table.Columns.Add("Name", typeof(string));
    table.Rows.Add(1, "Foo");
    table.Rows.Add(2, "Bar");
    
    GridView1.AutoGenerateColumns = false; // 自動で列が生成されるのをやめる
    GridView1.Columns.Add(new HyperLinkField()
    {
      HeaderText = "番号", // 列タイトル
      DataTextField = "Id", // 表示したい列の名前
      DataNavigateUrlFields = new string[]{ "Id"},
      DataNavigateUrlFormatString = "~/aaaa.aspx?ID={0}",
    });
    GridView1.DataSource = table;
    GridView1.DataBind();
    
    

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年8月5日 10:39
  • なかむらさん大変わかりやすいご回答誠にありがとうございます。

    上記例でうまくいくことを確認させていただきました。

    光栄至極に存じます。

    リンクはうまくいったのですがもちろん複数列があるわけで

    他の列が表示されなかったので、自分なりに上記例を参考に

    ただの文字列の列を追加してみました。

     GridView1.Columns.Add(new BoundField()
                    { DataField = "名前" });

    これをwhileでぐるぐるまわして列分追加するのが妥当な方法でしょうか?

    うまくいくことは確認できているのですが、もう少し美しい例があればと思い

    質問させていただきます。よろしくお願いします。

    2010年8月6日 14:01
  • コードや Visual Studio のデザイナで、列分追加するしかないと思います。
    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年8月6日 20:56
  • なかむらさんご連絡ありがとうございます。

    やはり、それしかないですか。

    助かりました。

    2010年8月7日 1:52