2016-06-29 1 views
0

Ich habe eine Schaltfläche ("SubmitButtonTournamentName") erstellt, die eine Gridview ("GridViewTournaments") mit Informationen aus einer SQL-Datenbank füllt (nachdem ich auf die Schaltfläche geklickt habe). Diese Rasteransicht zeigt mehrere Daten und enthält zwei Dropdown-Listen, in denen ich Informationen und ein Kontrollkästchen auswählen kann. Unterhalb der Gridview befindet sich ein Submit-Button.asp.net C# Gridview Anzahl immer Null

Wenn ich auf den Knopf klicke, möchte ich eine Bestätigung haben. Wenn ich keine Option in einer der Dropdown-Listen auswähle, sollte sie ihre Farbe ändern. Dies ist meine Schaltfläche Handler, der auf die Schaltfläche klickt fängt:

public void BtnHandler(Object sender, EventArgs e) { 
     Button btn = (Button)sender; 
     switch (btn.CommandName) { 
     case "SubmitButtonTournamentName": { 
      //fill GridViewTournaments 
      // sql stuff... 

      try { 
       sqlConnection.Open(); 
       IDataReader dr = idbCommand.ExecuteReader(); 
       DataTable dt = new DataTable(); 
       dt.Load(dr); 
       GridViewTournaments.DataSource = dt; 
       GridViewTournaments.DataBind(); 
       dr.Close(); 
      } catch (Exception ex) { 
       System.Diagnostics.Debug.WriteLine("error: " + ex); 
      } finally { 
       sqlConnection.Close(); 
      } 
     } 
     break; 

     case "btnSubmitEntry": { 
      //Here I try to validate the input 
      bool formError = false; 
      DataTable dt = new DataTable(); 
      dt.Columns.AddRange(new DataColumn[5] { new DataColumn("tourn_name"), new DataColumn("start_date"), new DataColumn("status"), new DataColumn("choice"), new DataColumn("doublePartner") }); 

      int count = GridViewTournaments.Rows.Count; 
      System.Diagnostics.Debug.WriteLine("gridview count: " + count); 
      foreach (GridViewRow row in GridViewTournaments.Rows) { 
       if (row.RowType == DataControlRowType.DataRow) { 
        CheckBox chkEntry = (row.Cells[5].FindControl("chkEntry") as CheckBox); 
        if (chkEntry.Checked) { 
         DropDownList choice = (row.Cells[3].FindControl("ddlChoice") as DropDownList); 
         DropDownList doublePartner = (row.Cells[4].FindControl("ddlDoublePartner") as DropDownList); 
         if (choice.SelectedValue.Equals("-1")) { 
          formError = true; 
          choice.BackColor = Color.Red; 
         } 
         if (doublePartner.SelectedValue.Equals("-1")) { 
          formError = true; 
          doublePartner.BackColor = Color.Red; 
         } 
         string name = row.Cells[0].Text; 
         string startDate = row.Cells[1].Text;//(row.Cells[1].FindControl("lblCountry") as Label).Text; 
         string status = row.Cells[2].Text; 
         dt.Rows.Add(name, startDate, status, choice, doublePartner); 
        } 
       } 
      } 
      if (formError == false) { 
       Server.Transfer("ProccessEntry.aspx", true); 
      } 
      GridViewTournaments.DataSource = dt; 
      GridViewTournaments.DataBind(); 
     } 
     break; 
     } 
    } 

Bei „btnSubmitEntry“ geklickt wird Ich versuche, das Datum aus dem Gridview zu bekommen, um die Farbe zu ändern und die gridview mit den geänderten Elemente neu zu schreiben.

Das ist meine Form:

<asp:GridView ID="GridViewTournaments" HeaderStyle-BackColor="#3AC0F2" HeaderStyle-ForeColor="White" 
      runat="server" AutoGenerateColumns="false"> 
      <Columns> 
       <asp:BoundField DataField="tourn_name" HeaderText="Name" ItemStyle-Width="150" /> 
       <asp:BoundField DataField="start_date" HeaderText="Start date" ItemStyle-Width="150" /> 
       <asp:BoundField DataField="status" HeaderText="Status" ItemStyle-Width="150" /> 
       <asp:TemplateField HeaderText="choice"> 
        <ItemTemplate> 
         <asp:Label ID="lblChoice" runat="server" Text='<%# Eval("choice") %>' Visible="false" /> 
         <asp:DropDownList ID="ddlChoice" runat="server"> 
          <asp:ListItem Text="Choose ..." Value="-1"></asp:ListItem> 
          <asp:ListItem Text="1st Choice" Value="1"></asp:ListItem> 
          <asp:ListItem Text="2nd Choice" Value="2"></asp:ListItem> 
          <asp:ListItem Text="3rd Choice" Value="3"></asp:ListItem> 
         </asp:DropDownList> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="doublePartner"> 
        <ItemTemplate> 
         <asp:Label ID="lblDoublePartner" runat="server" Text='<%# Eval("doublePartner") %>' Visible="false" /> 
         <asp:DropDownList ID="ddlDoublePartner" runat="server"> 
          <asp:ListItem Text="Some name" Value="1"></asp:ListItem> 
         </asp:DropDownList> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Want to enter?"> 
        <ItemTemplate> 
         <asp:Label ID="lblEnter" runat="server" Text='<%# Eval("enter") %>' Visible="false" /> 
         <asp:CheckBox runat="server" ID="chkEntry" /> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 
     <asp:Button ID="btnSubmitEntry" runat="server" Text="Submit" CommandName="btnSubmitEntry" OnClick="BtnHandler" /> 

Das Problem:

Die foreach-Schleife geht nicht die gridview Trog, weil es, dass es in ihm sind keine Zeilen angezeigt.

testete ich den Code und diese Null zurück:

GridViewTournaments.Rows.Count 

Was ich denke, ist, dass die „GridViewTournaments“ die auf Seitenkontext nicht binded wird so die Tastenhandler aus der Gridview die Information nicht erhalten.

Ich weiß, dass der Button die Seite neu lädt, aber ich mag es, Postback zu umgehen.

Vielleicht ist meine Lösung unkonventionell, also bitte sagen Sie mir, wenn ich total falsch liege.

+0

auf Fall ‚btnSubmitEntry‘ Sie zählen Zeilen, bevor die Daten zu gridview Bindung gibt es bereits Daten in gridview vor Schaltfläche klicken? – KanisXXX

+0

Ja, bevor ich auf den Button "btnSubmitEntry" klicke, befinden sich Daten in der Gridview. – Craiten

+0

binden Sie diese Daten in 'IsPostback'? – KanisXXX

Antwort

1

Wenn Sie binden GridView sollten Sie wickeln um einen if(!Page.IsPostBack){} sicher zu stellen, dass es wird nur gebunden, wenn die Seite Lasten und nicht auf jedem einzelnen Post back.Also, unter ein komplettes Arbeitsbeispiel dessen, was Sie ist‘ re zu erreichen versuchen:

-Code hinter:

public class User 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

public partial class GridViewValidation : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      this.BindData(); 
     } 
    } 

    private void BindData() 
    { 
     var u1 = new User { ID = 1, Name = "User1" }; 
     var u2 = new User { ID = 2, Name = "User2" }; 
     GridView1.DataSource = new List<User> { u1, u2 }; 
     GridView1.DataBind(); 
    } 

    protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     foreach (GridViewRow row in GridView1.Rows) 
     { 
      if (row.RowType == DataControlRowType.DataRow) 
      { 
       DropDownList doublePartner = (row.Cells[2].FindControl("ddlDoublePartner") as DropDownList); 
       doublePartner.BackColor = doublePartner.SelectedValue.Equals("-1") ? Color.Red : Color.Transparent; 
      } 
     } 
    } 
} 

.ASPX:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"> 
    <Columns> 
     <asp:BoundField DataField="ID" /> 
     <asp:BoundField DataField="Name" /> 
       <asp:TemplateField HeaderText="doublePartner"> 
      <ItemTemplate> 
       <asp:DropDownList ID="ddlDoublePartner" runat="server"> 
        <asp:ListItem Text="Value -1" Value="-1"></asp:ListItem> 
        <asp:ListItem Text="Value 1" Value="1"></asp:ListItem> 
        <asp:ListItem Text="Value 2" Value="2"></asp:ListItem> 
       </asp:DropDownList> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" /> 

Ausgang:

enter image description here