2013-09-25 3 views
1

У меня есть gridview, у которого есть sqldatasource. Мои данные должны быть такими:Gridview проверяет все строки перед обновлением

Desired

Но на любой строке, когда я нажимаю кнопку EDIT, а затем кнопку «Обновить», я хочу, чтобы проверить, что его предыдущая строка «Ending_Price» должно быть меньше, чем это строка Start_Price. Также End_Price этой строки должен быть меньше начальной стартовой цены Row.

Если это не так, тогда пользователь должен быть уведомлен, поскольку этот диапазон должен быть в порядке.

Вот мой код:

 protected void UpdateRecord(object sender, GridViewUpdateEventArgs e) 
    { 


     if (e.RowIndex == 0 && GridView1.Rows.Count != 1) 
     { 
      // Next Row Starting Value 
      TextBox txtNextStartingPoint = GridView1.Rows[e.RowIndex + 1].FindControl("txtStartingRange") as TextBox; 

      // This row ending value 
      TextBox txtThisEndingRange = GridView1.Rows[e.RowIndex].FindControl("txtEndingRange") as TextBox; 

      if (Convert.ToDecimal(txtThisEndingRange.Text) >= Convert.ToDecimal(txtNextStartingPoint)) 
      { 
       NotificationHelper.ShowError(this, "Invalid Ending Value"); 
       e.Cancel = true; 
       return; 
      } 

     } 

     TextBox txtStartingPoint = GridView1.Rows[e.RowIndex].FindControl("txtStartingRange") as TextBox; 
     TextBox txtEndingRange = GridView1.Rows[e.RowIndex].FindControl("txtEndingRange") as TextBox; 
     TextBox txtDiscount_Percentage = GridView1.Rows[e.RowIndex].FindControl("txtDiscount_Percentage") as TextBox; 
     Label txtDiscount_ID = GridView1.Rows[e.RowIndex].FindControl("lblId") as Label; 


     SqlDataSource1.UpdateParameters["sr"].DefaultValue = txtStartingPoint.Text; 
     SqlDataSource1.UpdateParameters["re"].DefaultValue = txtEndingRange.Text; 
     SqlDataSource1.UpdateParameters["perc"].DefaultValue = txtDiscount_Percentage.Text; 
     SqlDataSource1.UpdateParameters["discount_ID"].DefaultValue = txtDiscount_ID.Text; 


     SqlDataSource1.Update(); 
    } 



    /// <summary> 
    /// Edit record 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    protected void editRecord(object sender, GridViewEditEventArgs e) 
    { 
     // Get the current row index for edit record 
     GridView1.EditIndex = e.NewEditIndex; 

    } 


    protected void cancelRecord(object sender, GridViewCancelEditEventArgs e) 
    { 
     GridView1.EditIndex = -1; 
    } 

Это возвращает нулевое значение:

TextBox txtNextStartingPoint = GridView1.Rows[e.RowIndex + 1].FindControl("txtStartingRange") as TextBox; 

Вот мой GridView Markup

<asp:GridView ID="GridView1" runat="server" ShowHeaderWhenEmpty="True" AutoGenerateColumns="False" 
       OnRowCancelingEdit="cancelRecord" OnRowEditing="editRecord" OnRowUpdating="UpdateRecord" 
       CellPadding="4" GridLines="None" Width="673px" ForeColor="#333333" 
       DataSourceID="SqlDataSource1" OnDataBound="GridView1_DataBound" 
       > 
       <RowStyle HorizontalAlign="Center" /> 
       <AlternatingRowStyle BackColor="White" /> 
       <EditRowStyle BackColor="#7C6F57" /> 
       <FooterStyle BackColor="#1C5E55" ForeColor="White" Font-Bold="True" /> 
       <HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" /> 
       <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" /> 
       <RowStyle BackColor="#E3EAEB" /> 
       <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" /> 
       <Columns> 
        <asp:TemplateField> 
         <HeaderTemplate> 
          Id</HeaderTemplate> 
         <ItemTemplate> 
          <asp:Label ID="lblId" runat="server" Text='<%#Bind("discount_id")%>'></asp:Label> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField> 
         <HeaderTemplate> 
          Starting Point</HeaderTemplate> 
         <ItemTemplate> 
          <asp:Label ID="lblStartingRange" runat="server" Text='<%#Bind("starting_range") %>'></asp:Label> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <asp:TextBox ID="txtStartingRange" runat="server" Text='<%#Bind("starting_range") %>' 
           MaxLength="50"></asp:TextBox> 
         </EditItemTemplate> 
         <FooterTemplate> 
          <asp:TextBox ID="txtNewStartingRange" runat="server" MaxLength="50"></asp:TextBox> 
         </FooterTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField> 
         <HeaderTemplate> 
          Ending Range</HeaderTemplate> 
         <ItemTemplate> 
          <asp:Label ID="lblEndingRange" runat="server" Text='<%#Bind("ending_range") %>'></asp:Label> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <asp:TextBox ID="txtEndingRange" runat="server" Text='<%#Bind("ending_range") %>' 
           MaxLength="2"></asp:TextBox> 
         </EditItemTemplate> 
         <FooterTemplate> 
          <asp:TextBox ID="txtEndingRange" runat="server" MaxLength="2"></asp:TextBox> 
         </FooterTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField> 
         <HeaderTemplate> 
          Discount Percentage</HeaderTemplate> 
         <ItemTemplate> 
          <asp:Label ID="lbldiscount_percentage" runat="server" Text='<%#Bind("discount_percentage") %>'></asp:Label> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <asp:TextBox ID="txtDiscount_Percentage" runat="server" Text='<%#Bind("discount_percentage") %>' 
           MaxLength="10"></asp:TextBox> 
         </EditItemTemplate> 
         <FooterTemplate> 
          <asp:TextBox ID="txtNewDiscount_Percentage" runat="server" MaxLength="10"></asp:TextBox> 
         </FooterTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField> 
         <HeaderTemplate> 
          Operation</HeaderTemplate> 
         <ItemTemplate> 
          <asp:Button ID="btnEdit" runat="server" CommandName="Edit" Text="Edit" /> 
          <asp:Button ID="btnDelete" runat="server" CommandName="Delete" Text="Delete" CausesValidation="true" 
           OnClientClick="return confirm('Are you sure?')" /> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <asp:Button ID="btnUpdate" runat="server" CommandName="Update" Text="Update" /> 
          <asp:Button ID="btnCancel" runat="server" CommandName="Cancel" Text="Cancel" CausesValidation="false" /> 
         </EditItemTemplate> 
         <FooterTemplate> 
         </FooterTemplate> 
        </asp:TemplateField> 
       </Columns> 
       <EmptyDataTemplate> 
        No record available 
       </EmptyDataTemplate> 
      </asp:GridView> 

Что я должен делать? Есть идеи?

+0

Показать Разметка GridView –

+0

@FlopScientist, пожалуйста, проверьте edit –

ответ

1

другие запросы Возвратите значение, подобное этому?

// This row ending value 
TextBox txtThisEndingRange = GridView1.Rows[e.RowIndex].FindControl("txtEndingRange") as TextBox; 

или они также не имеют значения?

вы можете попробовать не использовать значение попробовать.

var txtNextStartingPoint = GridView1.Rows[e.RowIndex + 1].FindControl("txtStartingRange") 

Возможно, это не текстовое поле, из которого вы вернетесь.

+1

txtThisEndingRange возвращает правильное значение текущей строки, которая редактируется ... однако txtNextStartingPoint имеет значение null –

1

Есть 2 точки, которые необходимо принять на себя:

1.) Получение значений текущей строки (Row, который редактируется) В этом случае значения находятся внутри TextBox управления, так как строка в Теперь отредактируйте режим.

// This row ending value 
TextBox txtThisEndingRange = GridView1.Rows[e.RowIndex].FindControl("txtEndingRange") as TextBox; 

2.) Получение значения из следующей строки (строк рядом с текущей строкой редактируемой) В этом случае значение строки находится внутри Label управления, так как строка не находится в режиме Edit но в Normal режим.

Это означает, что элементы управления <ItemTemplate> в настоящее время визуализируются GridView и NOT <EditItemTemplate>.

Итак, теперь вы можете догадаться, что вам не нужно, чтобы найти TextBox: txtStartingRange, но вы должны получить Label: lblStartingRange

// Next Row starting Value 
Label lblNextStartRange= GridView1.Rows[e.RowIndex + 1].FindControl("lblStartingRange") as Label; 

и теперь сделать обычную проверки/сравнения значений, как:

if (Convert.ToDecimal(txtThisEndingRange.Text) >= Convert.ToDecimal(lblNextStartRange.Text)) 
{ 
.. 
.. 
} 
Смежные вопросы