2016-04-29 8 views
0

Ich kann Daten aus der Datenbank abrufen, um anzuzeigen, welches Y und N ist, indem ich das Kontrollkästchen in der Gridansicht anwende. Jetzt möchte ich jedoch speichern können, welche Checkbox nach der Bearbeitung wieder in die Datenbank eingecheckt wird.Geprüftes Kontrollkästchen in der Gridview in der Datenbank ASP.NET C#

Was ich bisher tat:

ASPX-

<asp:GridView ID="SiteGridView" runat="server" CssClass="datagrid" 
        GridLines="Vertical" AutoGenerateColumns="False" 
        Width="100%" 
        AllowPaging="True" AllowSorting="True" 
        DataKeyNames="promoID" OnRowCommand="GvPage_RowCommand" 
        OnPageIndexChanging="GvPage_PageIndexChanging" 
        OnSorting="GvPage_Sorting" 
        OnRowDatabound="SiteGridView_RowDataBound" 
        OnRowEditing="SiteGridView_RowEditing"> 
     <Columns>  
     <asp:TemplateField HeaderText="Default"> 
      <ItemTemplate> 
      <asp:CheckBox ID="process_flag" runat="server" 
       Checked='<%# bool.Parse(Eval("PROCESSED").ToString()) %>' 
       Enable='<%# !bool.Parse(Eval("PROCESSED").ToString()) %>' /> 
      </ItemTemplate> 
      <ItemStyle Width="20%" /> 
     </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

Codebehind:

 SqlCommand cmd = new SqlCommand("SELECT * , CAST(CASE defaults WHEN 'Y' THEN 1 ELSE 0 END AS BIT) AS PROCESSED FROM Promotions"); 
       SqlDataAdapter da = new SqlDataAdapter(); 
       DataTable dt = new DataTable(); 
       da.SelectCommand = cmd; 

       // Save results of select statement into a datatable 
       da.Fill(dt); 

       SiteGridView.DataSource = dt; 
       SiteGridView.DataBind(); 

     protected void SiteGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       //check userrole & display accrodingly 
       if (Session["ROLE"].ToString() != "SA") 
       { 
        //ImageButton btnEdit = (ImageButton)e.Row.FindControl("btnDelete"); 
        //btnEdit.Visible = false; 
        SiteGridView.Columns[4].Visible = false; 
       } 
      } 
     } 
+0

Möchten Sie den Checkbox-Status bei jedem Klick speichern? oder nur einmal nachdem der Benutzer in mehreren Zeilen agiert? – fnostro

+0

Speichern Sie das Kontrollkästchen bei jedem Klick – lel

Antwort

0

Aus irgendeinem Grund Trigger Checkboxes GridView RowCommand Ereignisse nicht auslösen. Es kann wahrscheinlich mit entsprechenden Aufrufen an ClientScript.GetPostBackEventReference() getan werden, aber das ist ein ganz anderes Niveau der Komplexität. Also, um auf einem CheckBox Klick zu handeln und behandeln Ereignisse individuell:

(NB: Ich habe viel von Ihrer Codierung gestrippt, um meine Punkte zu klären.)

  1. In Ihrem CheckBox gesetzt AutoPostBack="true"
  2. Fügen Sie einen Handler für OnCheckedChanged hinzu.
  3. Sicherstellen, dass die DataKey enthält die pk der Zeile, die Sie mit dem CheckBox-Staat

    // Simplified version of your markup 
    <asp:GridView ID="SiteGridView" runat="server" 
           DataKeyNames="promoID" 
           OnRowDataBound="SiteGridView_RowDataBound"> 
        <Columns> 
        <asp:TemplateField HeaderText="Default"> 
         <ItemTemplate> 
         <asp:CheckBox ID="process_flag" runat="server" 
          Checked='<%# bool.Parse(Eval("PROCESSED").ToString()) %>' 
          Enable='<%# !bool.Parse(Eval("PROCESSED").ToString()) %>' 
          OnCheckedChanged="process_flag_CheckedChanged" /> 
         </ItemTemplate> 
        </asp:TemplateField> 
        </Columns> 
    </asp:GridView> 
    
  4. Im RowDataBound Ereignisse aktualisieren müssen, die CheckBox finden und den Zeilenindex als Attribut

    // Merge this with your `RowDataBound` event 
    protected void SiteGridView_RowDataBound(object sender, GridViewRowEventArgs e) { 
        if (e.Row.RowType == DataControlRowType.DataRow) { 
         CheckBox cbx = (CheckBox) e.Row.FindControl("CheckBox1"); 
         cbx.Attributes[ "data-row-idx" ] = e.Row.RowIndex.ToString(); 
        } 
    } 
    
    hinzufügen
  5. Behandeln Sie das CheckChanged Ereignis:

    // Add this handler to your code 
    protected void process_flag_CheckedChanged(object sender, EventArgs e) 
    { 
        CheckBox cbx = (CheckBox) sender; 
        Int32 rowidx = Convert.ToInt32(cbx.Attributes["data-row-idx"]); 
        Int32 pk = (Int32) GridView4.DataKeys[rowidx].Value; 
    
        // simple way to see event arguments before actually touching the database 
        GridView4.Caption = string.Format(
         "CheckChanged: Row {0}, State: {1}, RowPK: {2} ", rowidx , (cbx.Checked ? "Checked" : "Unchecked"), pk); 
    
        // Save Data and rebind the gridview to reflect changes 
        // Verify your parameters before attempting an actual update 
        // YourDatabaseCallWithAppropriateParamaters(...); 
        GridView1.DataBind(); 
    } 
    
1

Haben Sie versucht: Markiert =‘<% # Eval ("bearbeitet")% > '

Wenn ja, welche Fehlermeldungen haben Sie bekommen?

+0

ausprobiert! kein Fehler Pop-out – lel

0

Verwenden Sie zuerst eine foreach-Schleife, um herauszufinden, welche Zeilen geprüft werden. Speichern Sie dann die ID dieser Zeilen in einer Liste.

foreach (GridViewRow row in SiteGridView.Rows) 
     { 
      if (row.RowType == DataControlRowType.DataRow) 
      { 
       CheckBox chkRow = (row.Cells[0].FindControl("process_flag") as CheckBox); 
       if (chkRow.Checked) 
       { 
        string ID = row.Cells[columnID].Text; 
+0

Sorry, aber die Spalten-ID ist? weil meine andere Spalte mit der Datenbank verbunden ist. – lel

+0

Zeigen Sie mir Ihr SiteGridView_RowDataBound-Ereignis –

+0

Ich füge das SiteGridView_RowDataBound-Ereignis in Codebehind – lel

Verwandte Themen