2016-08-05 28 views
1

私は多くの列を持つグリッドビューを持っています。それはソート可能です、Allow Sorting = "True"、各列にはソート式があります。うまく作品をソートする列ごとに、私はRow_Databoundイベントに割り当てる動的なヘッダを持っている10個の列を除い:グリッドビューで動的な列ヘッダーをクリック可能にするには

protected void gvSearchResults_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.Header) 
    { 
     for (int i = 1; i < 11; i++) 
     { 
      if (Session["Label" + i.ToString()] !=null) 
      { 
       e.Row.Cells[i].Text = Session["Label" + i.ToString()].ToString(); 
      } 
     } 

    } 
} 

これらの10個の列はクリックできません。クリック可能にする方法はありますか?これらの列にある他のすべてがソート可能です。

Page_LoadイベントまたはPage_Initイベントで列を作成する方法について、別のフォーラムからいくつかの提案がありますが、これはおそらく私にとっては役に立ちません。

ありがとうございます。

答えて

1

あなたは、ヘッダーセル内の既存のLinkBut​​tonコントロールのテキストを置き換えることができます。

protected void gvSearchResults_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.Header) 
    { 
     for (int i = 1; i < 11; i++) 
     { 
      string caption = Session["Label" + i.ToString()] as string; 

      if (caption != null) 
      { 
       TableCell headerCell = e.Row.Cells[i]; 
       LinkButton lnkSort = headerCell.Controls[0] as LinkButton; 
       lnkSort.Text = caption; 
      } 
     } 
    } 
} 
+1

私はこの回答に投票しました。ヘッダーがキャストされる可能性のあるLinkBut​​tonであるということは、私にとってはまったく起こりませんでした。 – VDWWD

0

できます。 HTMLコードを見ると、GridViewをソートするためのリンクと同様のものが表示されます。

<a href="javascript:__doPostBack('ctl00$mainContentPane$ctl02$GridView1','Sort$sortExpression')">yourColumnName</a> 

RowDataBound関数でそのリンクを再作成する必要があります。

for (int i = 1; i < 11; i++) 
{ 
    //first we cast the sender as a gridview 
    GridView gv = sender as GridView; 

    //get the unique ID of the gridview, this is different from ClientID which you normally would use for JavaScipt etc 
    string uniqueID = gv.UniqueID; 

    //then get the SortExpression for the column 
    string sortExpression = gv.Columns[i].SortExpression; 

    //get the new column name from the session 
    string yourColumnName = string.Empty; 
    if (Session["Label" + i.ToString()] != null) 
    { 
     yourColumnName = Session["Label" + i.ToString()].ToString(); 
    } 

    //and then we fill the header with the new link 
    e.Row.Cells[i].Text = "<a href=\"javascript:__doPostBack('" + uniqueID + "','Sort$" + sortExpression + "')\">" + yourColumnName + "</a>"; 
} 

有効にするには、enableEventValidationをfalseに設定する必要がありますが、これはお勧めできません。そうしないと、「無効なポストバックまたはコールバック引数」エラーが発生します。

データがグリッドビューにバインドされる前に、何らかの方法で列名を変更する方がよいでしょう。

0

はあなたの助けのためにありがとうございました。 LinkBut​​tonのソリューションは私にとって素晴らしい仕事でした:

protected void gvSearchResults_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.Header) 
    { 
     for (int i = 1; i < 11; i++) 
     { 
      if (Session["Label" + i.ToString()] !=null) 
      { 
       ((LinkButton)(e.Row.Cells[i].Controls[0])).Text = Session["Label" + i.ToString()].ToString(); 
      } 
     } 

    } 
} 
+0

それは私の答えと同じですね。もしそうなら、私の答えを正しいものとして受け入れることができます。 – ConnorsFan

+0

申し訳ありませんが、これを行う方法はわかりませんでしたが、これは私の最初の投稿です。私はそれが正しいことを願っています。 – Peter

+0

はい、あなたはそれを正しく行いました。私はあなたが最初に質問をしているのを見ました。それが私のコメントをした理由です。ところで、StackOverflowへようこそ。 :-) – ConnorsFan

関連する問題