2016-06-29 16 views
0

私はボタンをクリックした後、SQLデータベースからの情報でGridView(「GridViewTournaments」と呼ばれる)を塗りつぶすボタン(SubmitButtonTournamentNameと呼ばれる)を作成しました。 このグリッドビューにはいくつかのデータが表示され、情報とチェックボックスを選択できる2つのドロップダウンリストが含まれています。グリッドビューの下には送信ボタンがあります。asp.net C#gridview count always zero

私がボタンをクリックすると、検証が必要です。ドロップダウンリストの1つでオプションを選択しなかった場合は、その色を変更する必要があります。場合

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; 
     } 
    } 

「btnSubmitEntry」私は、GridViewのから日付を取得色を変更し、変更された要素とのGridViewを書き換えしようとクリックされた: これは、ボタンのクリックをキャッチし、私のボタンハンドラがあります。

これは私のフォームです:

<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" /> 

問題:

foreachループは、ゼロ行がそれであることが表示されますので、GridViewコントロールの谷なっていません。

私は、コードをテストし、これはゼロを返します。

GridViewTournaments.Rows.Count 

私はボタンハンドラがGridViewのからの情報を得ることはありませんので、「GridViewTournamentsは、」ページのコンテキストにバインドされていないこと、だと思う何ですか。

ボタンがページをリロードすることはわかっていますが、私はポストバックを回避したいと思います。

多分私の解決策は慣習ではないので、私が完全に間違っているかどうか教えてください。

+0

あなたはGridViewのにデータをバインドする前に、行をカウントしているが、GridViewの中のデータが既に存在しているのですか? – KanisXXX

+0

はい、「btnSubmitEntry」ボタンをクリックする前に、gridviewにデータがあります。 – Craiten

+0

あなたは 'IsPostback'の中にそのデータをバインドしていますか? – KanisXXX

答えて

1

あなたのGridViewあなたが以下の、ときに、ページロードはなく一つ一つのポストback.Alsoにそれが唯一の束縛されることを確認するためにif(!Page.IsPostBack){}のまわりでそれをラップする必要がありますバインド「何の完全な実施例であります達成しようとして再:背後

コード:

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" /> 

出力:ボタンをクリックする前にケース 'btnSubmitEntry' で

enter image description here