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.
auf Fall ‚btnSubmitEntry‘ Sie zählen Zeilen, bevor die Daten zu gridview Bindung gibt es bereits Daten in gridview vor Schaltfläche klicken? – KanisXXX
Ja, bevor ich auf den Button "btnSubmitEntry" klicke, befinden sich Daten in der Gridview. – Craiten
binden Sie diese Daten in 'IsPostback'? – KanisXXX