2016-08-12 2 views
0

У меня есть GridView в LoginView, с которым я получаю ошибку «Исходящий из диапазона». Когда я показываю # строк в GridView, он всегда показывает 0, что вызывает эту ошибку.GridView в LoginView, дающий неправильный счет строки

Есть ли что-то конкретное, что мне нужно сделать, чтобы получить GridView , чтобы правильно работать в LoginView?

Ниже приведен код, который запускается, когда я нажимаю кнопку в GridView, и ошибка появляется только на линии GridView row = gv.Rows[e.RowIndex];. Если я использую только e.RowIndex, я не получаю ошибку, и она фактически вернет правильный номер. Если я сделаю gv.DataKeys.Count, он вернет правильный счет. Если я делаю gv.Rows.Count, это всегда будет 0. Я думаю, что это имеет какое-то отношение к PostBack, потому что если я сделаю подсчет строк в моем page_load, тогда он вернет правильный счет. Пожалуйста, дайте мне знать, если есть что-то еще, что вам нужно для публикации?

protected void OnRowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    try 
    { 
     GridView gv = ReviewLoginView.FindControl("gvReview") as GridView; 
     GridViewRow row = gv.Rows[e.RowIndex]; 

     string Id = (row.FindControl("lblID") as Label).Text; 

     string constr = System.Configuration.ConfigurationManager.AppSettings["ObservationCardCS"]; 
     using (SqlConnection con = new SqlConnection(constr)) 
     { 
      using (SqlCommand cmd = new SqlCommand("cardReview")) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.Parameters.AddWithValue("@id", Id); 

       cmd.Connection = con; 
       con.Open(); 
       cmd.ExecuteNonQuery(); 
       con.Close(); 
      } 
     } 
     gv.EditIndex = -1; 
     this.BindGrid(); 

    } 
    catch (Exception ex) 
    { 

     GridView gv = ReviewLoginView.FindControl("gvReview") as GridView; 

     int index = e.RowIndex; 

     lblError.ForeColor = System.Drawing.Color.Red; 
     lblError.Text = ex.Message + " " + index.ToString() + " " + gv.Rows.Count; 
    } 
} 

Ниже приведено имя входа в систему на странице aspx.

<asp:LoginView runat="server" ViewStateMode="Disabled" ID="ReviewLoginView"> 
     <LoggedInTemplate> 
     <%--<AnonymousTemplate>--%> 
      <div> 
       <asp:GridView ID="gvReview" runat="server" AutoGenerateColumns="false" DataKeyNames="ID" 
        OnRowDataBound="OnRowDataBound" OnRowDeleting="OnRowDeleting" EnableViewState="true" 
        EmptyDataText="No records have been added." AllowSorting="true" ShowHeaderWhenEmpty="true" 
        AlternatingRowStyle-BackColor="#e0e0e0" HeaderStyle-BackColor="#d0d0d0" ViewStateMode="Disabled" 
        EnableSortingAndPagingCallbacks="false"> 
        <Columns> 
         <asp:TemplateField HeaderText="ID" ShowHeader="false" Visible="true"> 
          <ItemTemplate> 
           <asp:Label ID="lblID" runat="server" Text='<%# Bind("ID") %>' CssClass="cmsID"></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="User"> 
          <ItemTemplate> 
           <asp:Label ID="lblSubmittedBy" runat="server" Text='<%# Eval("submittedBy") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Location"> 
          <ItemTemplate> 
           <asp:Label ID="lblLocation" runat="server" Text='<%# Eval("location") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Date"> 
          <ItemTemplate> 
           <asp:Label ID="lblSubmittedDate" runat="server" Text='<%# Eval("submittedDate") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="What Was Observed?"> 
          <ItemTemplate> 
           <asp:Label ID="lblWhatWasObserved" runat="server" Text='<%# Eval("whatWasObserved") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="What Action Was Taken?"> 
          <ItemTemplate> 
           <asp:Label ID="lblWhatActionWasTaken" runat="server" Text='<%# Eval("whatActionWasTaken") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="What Agreement Was Reached?"> 
          <ItemTemplate> 
           <asp:Label ID="lblWhatAgreementWasReached" runat="server" Text='<%# Eval("whatAgreementWasReached") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Edit"> 
          <ItemTemplate> 
           <asp:Button ID="btnSubmit" runat="server" Text="Edit" CssClass="editbutton" /> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:CommandField HeaderText="Review" ButtonType="Button" ShowDeleteButton="true" DeleteText="Review" /> 
        </Columns> 
       </asp:GridView> 
      </div> 
      </LoggedInTemplate> 
     <%--</AnonymousTemplate>--%> 
        <AnonymousTemplate> 
      You must login to view submitted Observation Cards. 
     </AnonymousTemplate> 
    </asp:LoginView> 

Ниже BindGrid()

private void BindGrid() 
{ 
    try 
    { 
     SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["ObservationCardCS"]); 
     { 
      SqlCommand comm = new SqlCommand("cardSelectNew2", conn); 
      SqlDataAdapter sda = new SqlDataAdapter(); 
      sda.SelectCommand = comm; 
      comm.CommandType = CommandType.StoredProcedure; 
      comm.Parameters.AddWithValue("@Begin", "1/1/1950"); 
      comm.Parameters.AddWithValue("@End", "12/31/2049"); 
      comm.Parameters.AddWithValue("@Reviewed", "0"); 
      comm.Parameters.AddWithValue("@OrderBy", "CH.id"); 
      comm.Parameters.AddWithValue("@AscDesc", "Asc"); 
      comm.Parameters.AddWithValue("@DateRange", "Last 30 Days"); 

      comm.Connection = conn; 
      sda.SelectCommand = comm; 

      DataTable dt = new DataTable(); 
      sda.Fill(dt); 

      GridView gv = ReviewLoginView.FindControl("gvReview") as GridView; 

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

     } 
    } 
    catch (Exception ex) 
    { 
     lblError.ForeColor = System.Drawing.Color.Red; 
     lblError.Text = ex.Message; 
    } 
} 

Ниже мой Page_Load

protected void Page_Load(object sender, EventArgs e) 
{ 

    if (!this.IsPostBack) 
    { 
     this.BindGrid(); 
     lblError.ForeColor = System.Drawing.Color.Black; 
     lblError.Text = ""; 
    } 

} 
+1

fyi внутри вашего использования вам не нужно вызывать метод close. 'Con.Close()' также то, что делает хранимая процедура, это запрос выбора запроса запроса.? если это Select Query, вам нужно изменить cmd.ExecuteNonQuery, чтобы использовать либо DataAdapeter метода Datatable.Fill. – MethodMan

+0

Хранимый Proc просто отмечает запись как «проверенную», проверяя бит столбца. У меня есть метод Datatable.Fill в моем коде BindData(). – b3ns

+0

, пожалуйста, покажите свою разметку – naveen

ответ

0

Вы на правильном пути! Но, не видя всего класса и разметки, мы можем только догадываться.

Убедитесь, что вы не очищаете или не восстанавливаете данные в обработчике событий загрузки страницы, если Grid и источник данных определены в разметке, тогда он должен кэшировать или запрашивать данные между обратными передачами страниц, проверьте, что вы установили EnableRowCache на GridView, так что вам не нужно повторно запрашивать данные во время обратной передачи.

Похоже, что вы используете #OldSchool BindGrid() шаблон загрузки данных, возможно, самое простое решение может быть, чтобы гарантировать, что данные загружаются путем вызова BindGrid, прежде чем пытаться получить доступ к строкам:

protected void OnRowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    this.BindGrid(); 
    try 
    { 
... delete logic 
     this.BindGrid(); // re-load after the change 
    } 
    catch (Exception ex) 
    { 
... 
    } 
} 

Без включения кеша строки, хотя вы должны убедиться, что одни и те же данные загружены в сетку в том же порядке или логика удаления, подобная этому, на основе индекса строки (вместо первичного ключа строки) может привести к удалению неправильная строка данных.

+0

Каждый раз, когда я пытаюсь опубликовать код целиком, я получаю ошибку форматирования. Есть ли что-то конкретное, что я могу опубликовать, что поможет? Я добавил код в свой page_load, чтобы убедиться, что BindGrid() выполняется только при необходимости. Я добавил this.BindGrid() до моего try/catch в методе OnRowDeleting, и я больше не ошибаюсь, но теперь ничего не происходит. Из того, что я вижу, я не вижу нигде, что я перестраиваю данные между page_load и OnRowDeleting. Любые другие предложения? – b3ns

+0

Попробуйте удалить ViewStateMode = «Отключено» в сетке ... или явно настроить его на включенное. –

+0

Пробовал удалить и явно настроить на включенное. Все еще не работает должным образом. Это меня озадачивает! – b3ns

Смежные вопросы