2013-03-03 6 views
1

Я ломал себе голову при попытке получить доступ к ID столбец GridView, в котором пользователь выбирает опцию:Возвращение Gridview Checkbox булево

<asp:GridView ID="gvUserFiles" runat="server"> 
      <Columns> 
      <asp:TemplateField HeaderText="Select" ItemStyle-HorizontalAlign="Center" > 
       <ItemTemplate> 
        <asp:CheckBox ID="chkSelect" runat="server" /> 
       </ItemTemplate> 
      </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 

The GridView столбцов chkSelect (галочка), Id, имя_файла, CreateDate

Когда пользователь проверяет флажок и нажимает кнопку, я хочу получить значение столбца «id».

Вот мой код для кнопки:

foreach (GridViewRow row in gvUserFiles.Rows) 
      { 
       var test1 = row.Cells[0].FindControl("chkSelect"); 
       CheckBox cb = (CheckBox)(row.Cells[0].FindControl("chkSelect")); 
       //chk = (CheckBox)(rowItem.Cells[0].FindControl("chk1")); 
       if (cb != null && cb.Checked) 
       { 
        bool test = true; 

       } 
      } 

cb.checked всегда возвращается ложь.

ответ

3

Флажки не всегда бесконтрольно может быть проблема DataBinding. Убедитесь, что вы не привязываетесь к GridView перед тем, как вызывается событие нажатия кнопки. Иногда люди привязывают DataBinding к событию Page_load, а затем сохраняют DataBinding на каждом PostBack. Поскольку он вызывается перед нажатием кнопки, он может оказывать прямое влияние. Когда GridView является DataBound, вы теряете все состояние, которое появилось на странице.

Если вы DataBind в GridView на Page_load, оберните его проверки !IsPostBack:

if (!IsPostBack) 
{ 
    gvUserFiles.DataSource = data; 
    gvUserFiles.DataBind(); 
} 

Если это не ваш случай, то вы можете попробовать проверки проверяемый свойства на основе Request.Form значений:

protected void button_OnClick(object sender, EventArgs e) 
{ 
    foreach (GridViewRow row in gvUserFiles.Rows) 
    { 
     CheckBox cb = (CheckBox)row.FindControl("chkSelect"); 

     if (cb != null) 
     { 
      bool ckbChecked = Request.Form[cb.UniqueID] == "on"; 

      if (ckbChecked) 
      { 
       //do stuff 
      } 
     } 
    } 
} 

Значение Checked значение CheckBox высчитано. "on". И если он не установлен в браузере, ничего не происходит по запросу.

+0

Хорошо, я определенно привязываю данные к странице_load. Как я должен привязать данные к сетке? –

+0

Ок, завернутый 'gvResults.DataSource = UserResults; gvResults.DataBind(); ' в' if (! Page.PostBack) 'и он сработал. Ты обалденный! –

+0

@ Тим Джонсон, Извините, я должен был правильно разместить ответ, я просто не знал, что это проблема. Вы можете принять его как ответ, если он соответствует вашим потребностям. Я обновил ответ. –

1

Вы можете достичь его, используя DataKey как этот

Добавить DataKey в свой GridView

<asp:GridView ID="gvUserFiles" runat="server" DataKeyNames="Id"> 

и получить его на стороне сервера, как это

string value = Convert.ToString(this.gvUserFiles.DataKeys[rowIndex]["Id"]); 
Смежные вопросы