2013-09-06 3 views
2
<asp:GridView ID="SearchGrid" runat="server" GridLines="Both" AutoGenerateColumns="false"> 
         <Columns> 
          <asp:BoundField DataField="Q" HeaderText="Q" /> 
          <asp:TemplateField HeaderText="C"> 
           <ItemTemplate> 
            <asp:CheckBox ID="CCheckbox" runat="server" AutoPostBack="true" OnCheckedChanged="CCheckbox_CheckedChanged" /> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="R"> 
           <ItemTemplate> 
            <asp:CheckBox ID="RCheckbox" runat="server" AutoPostBack="true" OnCheckedChanged="RCheckbox_CheckedChanged" /> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="E"> 
           <ItemTemplate> 
            <asp:CheckBox ID="ECheckbox" runat="server" AutoPostBack="true" OnCheckedChanged="ECheckbox_CheckedChanged" /> 
           </ItemTemplate> 
          </asp:TemplateField> 
         </Columns> 
        </asp:GridView> 

Это мой Aspx код GridViewдобавив флажок динамически GridView

if (ViewState["SearchGrid"] == null) 
      { 
       SearchTable.Columns.Add(new DataColumn("Q", typeof(string))); 
       SearchTable.Columns.Add(new DataColumn("C", typeof(bool))); 
       SearchTable.Columns.Add(new DataColumn("R", typeof(bool))); 
       SearchTable.Columns.Add(new DataColumn("E", typeof(bool))); 
       ViewState["SearchGrid"] = SearchTable; 
      } 
      SearchTable =(DataTable) ViewState["SearchGrid"]; 
      DataRow dr = null; 
      dr = SearchTable.NewRow(); 
      dr["Q"] = MySearchTextBox.Text; 
      switch (SearchType) 
      { 
       case "Contains": dr["C"] =true; 
        break; 
       case "Related": dr["R"] = true; 
        break; 
       case "Exact": dr["E"] = true; 
        break; 
      } 

и мой код позади.

Во время добавления строки я должен проверить флажок paticular. Я пытался проверить флажок, указав его значения как истинные, но он, похоже, не работает. Может ли кто-нибудь сказать мне, что я делаю неправильно здесь?

+0

Вы устанавливаете «CheckBox» в true или 'CheckBox.Checked' в true? –

+0

@garrison Как я могу поставить checkBox.checked = true? потому что элемент управления не был добавлен в таблицу, так что я могу найти элемент управления и проверить его? – AMS

+3

Обработать событие GridView 'OnRowDataBound'. Найдите CheckBox, установите его значение «Проверено» на основе вашего алгоритма. –

ответ

0

Вы можете попробовать проверить функциональность GridView.RowDataBound. Используйте это событие для захвата строки, когда она привязана к данным, а затем вы можете получить доступ к элементу CheckBox и присвоить его значение .Checked.

Ссылка: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx

1

Вы можете связать в разметке к значению: Проверено = '<% # Eval ("C")%>'

<asp:GridView ID="SearchGrid" runat="server" GridLines="Both" AutoGenerateColumns="false"> 
    <Columns> 
     <asp:BoundField DataField="Q" HeaderText="Q" /> 
     <asp:TemplateField HeaderText="C"> 
      <ItemTemplate> 
       <asp:CheckBox ID="CCheckbox" runat="server" AutoPostBack="true" OnCheckedChanged="CCheckbox_CheckedChanged" Checked='<%# Eval("C") %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
      <asp:TemplateField HeaderText="R"> 
      <ItemTemplate> 
       <asp:CheckBox ID="RCheckbox" runat="server" AutoPostBack="true" OnCheckedChanged="RCheckbox_CheckedChanged" Checked='<%# Eval("E") %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
      <asp:TemplateField HeaderText="E"> 
      <ItemTemplate> 
       <asp:CheckBox ID="ECheckbox" runat="server" AutoPostBack="true" OnCheckedChanged="ECheckbox_CheckedChanged" Checked='<%# Eval("R") %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

Или вы можете использовать RowDataBound событие: OnRowDataBound = "SearchGrid_RowDataBound"

разметке Изменение:

<asp:GridView ID="SearchGrid" runat="server" GridLines="Both" AutoGenerateColumns="false" OnRowDataBound="SearchGrid_RowDataBound"> 

Codebehind: Обратите внимание: я использовал объект списка вместо datatable.

public class TestObject 
{ 
    public string Q { get; set; } 
    public bool C { get; set; } 
    public bool R { get; set; } 
    public bool E { get; set; } 
} 
public partial class Default : System.Web.UI.Page 
{ 
    public List<TestObject> Values { get; set; } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      //NEED SOME DATA TO TEST THE RESULT 
      Values = new List<TestObject>(); 

      Values.Add(new TestObject() { Q = "test 1", C = true, E = true, R = true }); 
      Values.Add(new TestObject() { Q = "test 1", C = true, E = false, R = true }); 
      Values.Add(new TestObject() { Q = "test 1", C = true, E = true, R = false }); 
      Values.Add(new TestObject() { Q = "test 1", C = false, E = true, R = true }); 
      //BIND TO THE GRID 
      SearchGrid.DataSource = Values; 
      SearchGrid.DataBind(); 
     } 
    } 

    //FIRES FOR EVERY ROW IN THE GRID 
    protected void SearchGrid_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     //WE ONLY CARE ABOUT THE DATAROW NOT HEADER ETC 
     if (e.Row.RowType != DataControlRowType.DataRow) 
      return; 
     //GET THE BOUND INDIVIDUAL ITEM 
     TestObject obj = (TestObject)e.Row.DataItem; //IN YOUR CASE THIS WOULD BE: DataRow row = (DataRow)e.Row.DataItem 

     //FIND ALL THE CHECKBOXES 
     CheckBox cchk = e.Row.FindControl("CCheckBox") as CheckBox; 
     CheckBox echk = e.Row.FindControl("ECheckBox") as CheckBox; 
     CheckBox rchk = e.Row.FindControl("RCheckBox") as CheckBox; 

     //CHECK IT OR NOT BASED ON THE DATATITEMS VALUE 
     if (cchk != null) 
      cchk.Checked = obj.C; //IN YOUR CASE THIS WOULD BE: bool c = (bool)row["C"]; 

     if (echk != null) 
      echk.Checked = obj.E; 

     if (rchk != null) 
      rchk.Checked = obj.R; 
    } 
} 
+0

привет спасибо, это сработало. но теперь моя проблема заключается в том, что после добавления другой строки флажки предыдущей строки не отмечены, я включил режим просмотра для флажков, но все же флажки с проверенными строками не удаляются. любое решение для этой проблемы? – AMS

+0

Это довольно сложный вопрос. Переворачиваете ли вы сетку после добавления строки (вызов .databind())? Вы добавляете строку в данные или непосредственно в сетку? Используете ли вы один и тот же метод для установки e, c и r их респектабельным значениям при каждом вызове? Я бы рекомендовал вам отладить метод, который вы используете для создания столбца, и убедитесь, что у них есть правильные значения. – user2453734

+0

Я фактически создаю строку данных каждый раз, а затем добавляю ее в таблицу, а затем привязываю элемент управления сеткой к таблице данных. – AMS

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