2016-06-29 3 views
0

Я создал кнопку (называемую «SubmitButtonTournamentName»), которая заполняет gridview (называемую «GridViewTournaments») информацией из базы данных sql (после того, как я нажал на кнопку). Это gridview показывает несколько данных и включает в себя два dropdownlists, где я могу выбрать информацию и флажок. Ниже gridview - кнопка отправки.asp.net C# gridview count always zero

Когда я нажимаю на кнопку, мне нравится иметь валидацию. Если я не выберу вариант в одном из раскрывающихся списков, он должен изменить свой цвет. Это моя кнопка обработчик, который ловит щелчки кнопки:

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

Проблема:

Цикл Еогеасп не идет корыта GridView, потому что кажется, что есть нулевые строки в нем.

Я тестировал код, и это возвращает ноль:

GridViewTournaments.Rows.Count 

То, что я считаю, что «GridViewTournaments» не переплетен контексту страницы, так что обработчик кнопки не получает информацию от GridView.

Я знаю, что кнопка перезагружает страницу, но мне нравится обойти обратную передачу.

Возможно, мое решение является неконкурентоспособным, поэтому, пожалуйста, скажите мне, если я полностью ошибаюсь.

+0

по делу 'btnSubmitEntry' вы подсчет строк перед привязкой данных в GridView, есть уже данные в GridView до нажатия кнопки? – KanisXXX

+0

Да, перед тем как нажать кнопку «btnSubmitEntry», в gridview есть данные. – Craiten

+0

Вы связываете эти данные внутри 'IsPostback'? – KanisXXX

ответ

1

Когда вы связываете ваши GridView вы должны обернуть его вокруг if(!Page.IsPostBack){}, чтобы убедиться, что он только получает связаны, когда страница нагрузки, а не на каждый пост back.Also, ниже полный рабочий пример того, что вы» вновь пытается достичь:

код позади:

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

Выходные:

enter image description here