2016-08-05 5 views
1

У меня есть gridview со многими столбцами. Он сортируется, Allow Sorting = «True», каждый столбец имеет выражение сортировки. Для каждого столбца сортировки работает просто отлично, 10 столбцов, которые имеют динамические заголовки, которые я задаю в Row_Databound исключением случая:Как сделать динамический заголовок столбца clickable в gridview

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

Вы можете заменить текст существующего LinkButton в ячейке заголовка:

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

Я голосовал за этот ответ. Мне вообще не приходило в голову, что заголовок был LinkButton, который также можно было отбросить. – 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 должен быть установлен в ложь, которая не рекомендуется. В противном случае вы получите ошибку «Неверный ответ или обратный вызов».

Лучше было бы изменить имена столбцов так или иначе, прежде чем данные будут привязаны к gridview.

0

Большое спасибо за вашу помощь. Решение с LinkButton отлично поработало для меня:

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

Смежные вопросы