Проблема с текстовым полем при изменении в моем gridview - PullRequest
0 голосов
/ 26 марта 2020

Пожалуйста, помогите мне, я получаю странную ошибку в своем просмотре сетки, когда я пытаюсь вызвать событие с помощью OnTextboxChange, сетка просмотра добавляет строку.

У меня нет данных: https://zupimages.net/viewer.php?id=20 / 13 / m9xm.png

Когда я помещаю число в текстовое поле txtEvoN, txtN1 изменяется, но у меня есть новая строка в моей сетке :( :(: (

https://zupimages.net/viewer.php?id=20 / 13 / swbt.png

Пожалуйста, помогите, я в замешательстве: (

  <form id="form1" runat="server">
    <asp:GridView runat="server"  ID="maGrid" AutoGenerateColumns="false" ShowFooter="true" ShowHeaderWhenEmpty="true" 
        OnRowEditing="maGrid_RowEditing" OnRowCancelingEdit="maGrid_RowCancelingEdit" OnRowUpdating="maGrid_RowUpdating" OnRowDeleting="maGrid_RowDeleting"
        DataKeyNames="ProduitId" Width="100%" HeaderStyle-HorizontalAlign="Center">
        <Columns>
          <asp:TemplateField HeaderText="Produit" ItemStyle-Width="19%"  ItemStyle-HorizontalAlign="Center" >  
              <ItemTemplate>
                  <asp:Label Text='<%# Eval("Produitlibv") %>' runat="server" ></asp:Label>     
              </ItemTemplate>   
              <EditItemTemplate>    
                  <asp:TextBox ID="tbProduitlibv" Text='<%# Eval("Produitlibv") %>' runat="server" CssClass="form-control"/>     
              </EditItemTemplate>
              <FooterStyle Width="19%" /> 
              <FooterTemplate>
                  <asp:TextBox ID="txtProduitlibv" runat="server" CssClass="form-control"/>                                                       
              </FooterTemplate>
          </asp:TemplateField>

          <asp:TemplateField HeaderText="N" ItemStyle-Width="15%"  ItemStyle-HorizontalAlign="Center" >
              <ItemTemplate>
                  <asp:Label Text='<%# Eval("N") %>' runat="server"></asp:Label>
              </ItemTemplate>
              <EditItemTemplate>
                  <asp:TextBox ID="tbN" Text='<%# Eval("N") %>' runat="server" CssClass="form-control"/>
              </EditItemTemplate>
              <FooterStyle Width="15%" /> 
              <FooterTemplate>                                                
                 <asp:TextBox ID="txtN" runat="server" CssClass="form-control"/>


              </FooterTemplate>
          </asp:TemplateField>

          <asp:TemplateField HeaderText="% évolution" ItemStyle-Width="5%"  ItemStyle-HorizontalAlign="Center" >
              <ItemTemplate>
                  <asp:Label Text='<%# Eval("EvoN") %>' runat="server"></asp:Label>
              </ItemTemplate>
              <EditItemTemplate>
                  <asp:TextBox ID="tbEvoN" Text='<%# Eval("EvoN") %>' runat="server" CssClass="form-control"/>
              </EditItemTemplate>
              <FooterStyle Width="5%" /> 
              <FooterTemplate>                                              
                   <asp:TextBox ID="txtEvoN" runat="server" CssClass="form-control" OnTextChanged="txtEvoN_TextChanged" AutoPostBack="true" CausesValidation="true" ValidationGroup="Insert"/>
              </FooterTemplate>
          </asp:TemplateField>

          <asp:TemplateField HeaderText="N+1" ItemStyle-Width="10%"  ItemStyle-HorizontalAlign="Center" >
              <ItemTemplate>
                  <asp:Label Text='<%# Eval("N1") %>' runat="server"></asp:Label>
              </ItemTemplate>
              <EditItemTemplate>
                  <asp:TextBox ID="tbN1" Text='<%# Eval("N1") %>' runat="server" CssClass="form-control"/>
              </EditItemTemplate>
              <FooterStyle Width="15%" /> 
              <FooterTemplate>
                  <asp:TextBox ID="txtN1" runat="server" CssClass="form-control" ReadOnly="true" CausesValidation="true" ValidationGroup="Insert3"/>

             </FooterTemplate>

          </asp:TemplateField>

          <asp:TemplateField HeaderText="Actions" ItemStyle-Width="10%">
              <ItemTemplate>                                             
                  <asp:ImageButton ImageUrl="../images/edit2.png"  alt="edit" runat="server" CommandName="Edit" ToolTip="Modifier une vente" Width="15px" Height="15px" />
              </ItemTemplate>

              <FooterStyle Width="10%" /> 
              <FooterTemplate>
               <asp:ImageButton ImageUrl="../images/plus2.png" alt="Add" runat="server" CommandName="Add" ToolTip="Ajouter une vente" Width="15px" Height="15px" OnClick="ButtonAdd_Click"/>                                               
              </FooterTemplate>

          </asp:TemplateField>
        </Columns>
        <HeaderStyle HorizontalAlign="Center" BackColor="#9e408b" Font-Bold="True" ForeColor="White" BorderColor="White" Height="30px"></HeaderStyle>
      <PagerStyle BackColor="White" ForeColor="#9e408b" />
      <RowStyle BackColor="White" BorderColor="White" />
      <SelectedRowStyle BackColor="#9e408b" BorderColor="Black" BorderStyle="Solid" />
    </asp:GridView>

    <asp:Label id="lblMessage" runat="server" Text="" />
    <asp:Label id="lblMessage2" runat="server" Text="" />

</form>
    protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
             DataTable dtbl = new DataTable();
             using (SqlConnection con2 = new SqlConnection(WebConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
            {
                con2.Open();
                SqlDataAdapter sqlDa = new SqlDataAdapter("select ProduitId, Produitlibv,N, EvoN, N1  from[dbo].[ProduitsVentes] where IdUser='" + "ccd6941a-a028-4600-bfa5-ef07c0b6dd82" + "'", con2);
                sqlDa.Fill(dtbl);
            }
            if (dtbl.Rows.Count > 0)
            {
                maGrid.DataSource = dtbl;
                maGrid.DataBind();
            }
            else
            {
                dtbl.Rows.Add(dtbl.NewRow());
                maGrid.DataSource = dtbl;
                maGrid.DataBind();
                maGrid.Rows[0].Cells.Clear();
                maGrid.Rows[0].Cells.Add(new TableCell());
                maGrid.Rows[0].Cells[0].ColumnSpan = dtbl.Columns.Count;
                maGrid.Rows[0].Cells[0].Text = "No Data";
                maGrid.Rows[0].Cells[0].HorizontalAlign = HorizontalAlign.Center;
                ClientScript.RegisterStartupScript(this.GetType(), "hash", "location.hash = '#ventes';", true);
            }

            }


        }
protected void txtEvoN_TextChanged(object sender, EventArgs e)
        {
            TextBox txtN1, txtN, txtEvoN;
            txtN1 = (TextBox)maGrid.FooterRow.FindControl("txtN1");
            txtEvoN = (TextBox)maGrid.FooterRow.FindControl("txtEvoN");
            txtN = (TextBox)maGrid.FooterRow.FindControl("txtN");

            if (txtN1.Text == "") txtN1.Text = "0";
            if (txtEvoN.Text == "") txtEvoN.Text = "0";
            if (txtN.Text == "") txtN.Text = "0";

            txtN1.Text = Convert.ToString((Convert.ToDouble(txtN.Text) * Convert.ToDouble(txtEvoN.Text)) / 100);                     
        }

1 Ответ

1 голос
/ 27 марта 2020
dtbl.Rows.Add(dtbl.NewRow());

Это утверждение вызывает все ваши проблемы.

Вы наивно пытаетесь отобразить пустую строку, чтобы сделать видимым нижний колонтитул. Но эта строка вида сетки, когда вид сетки передается обратно, не содержит ручных операций, которые вы над ней выполняли. Предполагается, что в нулевой позиции есть строка, и поэтому также отображается кнопка действия Edit.

Вот исправление.

Прежде всего, чтобы предотвратить дублирование кода, мы переместите создание строки «Нет данных» в метод с перегрузкой для обработки случаев PostBack и! PostBack:

private void InsertNoDataRow()
{
    InsertNoDataRow(null);
}

private void InsertNoDataRow(DataTable dtbl)
{
    if (dtbl != null)
    {
        dtbl.Rows.Add(dtbl.NewRow());
        maGrid.DataSource = dtbl;
        maGrid.DataBind();
    }
    maGrid.Rows[0].Cells.Clear();
    maGrid.Rows[0].Cells.Add(new TableCell());
    maGrid.Rows[0].Cells[0].ColumnSpan = maGrid.Columns.Count;
    maGrid.Rows[0].Cells[0].Text = "No Data";
    maGrid.Rows[0].Cells[0].HorizontalAlign = HorizontalAlign.Center;
    ClientScript.RegisterStartupScript(this.GetType(), "hash", "location.hash = '#ventes';", true);
}

Затем в обработчике события Page_Load; мы называем их соответственно. Обратите внимание, что мы также вызываем этот метод, когда используется PostBack:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        . . .
        . . .
        if (dtbl.Rows.Count > 0)
        {
            maGrid.DataSource = dtbl;
            maGrid.DataBind();
        }
        else
        {
            InsertNoDataRow(dtbl);
        }
    }
    else
    {
        if (maGrid.Rows[0].Cells[0].Text == "No Data")
        {
            InsertNoDataRow();
        }
    }
}

И остается только одна вещь, с которой вы, вероятно, уже работаете. Когда запись добавляется (вызывается действие Add), нам нужно повторно связать таблицу данных, чтобы избавиться от фиктивной строки «No Data». Поскольку вы не опубликовали код для этого метода, я могу предоставить только необходимые шаги в виде комментариев:

protected void ButtonAdd_Click(object sender, EventArgs e)
{
    // Insert into DB.

    // Now we need to remove row 0 if it is still the dummy row showing "No Data".

    // Reselect the data table and bind again.
    // This time we expect at least one row to exist.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...