Cega86 0 Denunciar post Postado Junho 16, 2009 Boa tarde , estou com o seguinte problema: Tenho um grid view dentro de um update penel e nele tenho uma coluna do tipo command field para edição dos dados da grid, quando debuguei notei que toda vez que clico no botão edit ele passa 2 vezes pelo page load e com o postback com valor false quando deveria ser true. Acredito q seja alguma ziquizira do update panel,Alguem pode me ajudar? Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Junho 16, 2009 Não conheço nada do UpdatePanel que faça isso. Teria que postar o código para dar uma olhada. Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
Cega86 0 Denunciar post Postado Junho 17, 2009 Quintelab, segue o meu código. eu retirei a grid do updatepanel e continuou com o mesmo problema ele passa 2 vezes pelo pageload não sei oq pode ser. <asp:UpdatePanel id="UpdatePanel1" runat="server" UpdateMode="Conditional"> <contenttemplate> <asp:GridView id="GridViewProduto" runat="server" OnRowUpdating="GridViewProduto_RowUpdating" OnRowEditing="GridViewProduto_RowEditing" OnRowCancelingEdit="GridViewProduto_RowCancelingEdit" GridLines="None" ForeColor="#333333" CellPadding="4" AutoGenerateColumns="False" AllowSorting="True" OnSorting="GridViewProduto_Sorting"> <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White"></FooterStyle> <RowStyle BackColor="#EFF3FB"></RowStyle> <Columns> <asp:BoundField DataField="cod_produto" HeaderText="Código" ReadOnly="True" SortExpression="cod_produto"></asp:BoundField> <asp:TemplateField HeaderText="Nome do produto" SortExpression="nom_produto"><EditItemTemplate> <asp:TextBox id="TextBoxNome" runat="server" Text='<%# Bind("nom_produto") %>'></asp:TextBox> <asp:RequiredFieldValidator id="RequiredFieldValidator1" runat="server" ErrorMessage="Preencha o campo nome" ControlToValidate="TextBoxNome">*</asp:RequiredFieldValidator> </EditItemTemplate> <ItemTemplate> <asp:Label id="Label1" runat="server" Text='<%# Bind("nom_produto") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Sigla"><EditItemTemplate> <asp:TextBox ID="TextBoxSigla" runat="server" MaxLength="3" Text='<%# Bind("des_sigla") %>' Width="51px"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="TextBoxSigla" ErrorMessage="Preencha o campo sigla">*</asp:RequiredFieldValidator> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label2" runat="server" Text='<%# Bind("des_sigla") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Link" SortExpression="des_link"> <EditItemTemplate> <asp:TextBox ID="TextBoxLink" runat="server" Text='<%# Bind("des_link") %>' Width="185px"></asp:TextBox><asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="TextBoxLink" ErrorMessage="Preencha o campo link">*</asp:RequiredFieldValidator><asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="TextBoxLink" ErrorMessage='Coloque "http://" antes do link' ValidationExpression="http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?">*</asp:RegularExpressionValidator> </EditItemTemplate> <ItemTemplate> <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("des_link") %>' Target="_search" Text='<%# Eval("des_link") %>'></asp:HyperLink> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Ativo"><EditItemTemplate> <asp:CheckBox ID="CheckBoxStatus" runat="server" Checked='<%# Bind("log_ativo") %>' /> </EditItemTemplate> <ItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Bind("log_ativo") %>' Enabled="false" /> </ItemTemplate> </asp:TemplateField> <asp:CommandField CancelImageUrl="~/imagens/cancel.png" EditImageUrl="~/imagens/edit.png" ShowEditButton="True" UpdateImageUrl="~/imagens/apply.png" ButtonType="Image"></asp:CommandField> </Columns> <PagerStyle HorizontalAlign="Center" BackColor="#2461BF" ForeColor="White"></PagerStyle> <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333"></SelectedRowStyle> <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White"></HeaderStyle> <EditRowStyle BackColor="#2461BF"></EditRowStyle> <AlternatingRowStyle BackColor="White"></AlternatingRowStyle> </asp:GridView> <asp:Label ID="LabelError6" runat="server" ForeColor="Red" Text="Erro" Visible="False"></asp:Label><BR /> </contenttemplate> </asp:UpdatePanel> Esse aqui é o codebehind. using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class edita_produto : System.Web.UI.Page { DAOProduto daop = new DAOProduto(); protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Panel1.Visible = true; if (Session["dadosProdutos"] == null) { AtualizarGrid(true); } else { AtualizarGrid(false); ViewState["ordemProdutos"] = "asc"; } } } protected void GridViewProduto_RowEditing(object sender, GridViewEditEventArgs e) { GridViewProduto.EditIndex = e.NewEditIndex; AtualizarGrid(false); } protected void GridViewProduto_RowUpdating(object sender, GridViewUpdateEventArgs e) { string codigo = GridViewProduto.Rows[e.RowIndex].Cells[0].Text; TextBox valor1 = (TextBox)GridViewProduto.Rows[e.RowIndex].Cells[1].FindControl("TextBoxNome"); string nome_produto = valor1.Text; TextBox valor2 = (TextBox)GridViewProduto.Rows[e.RowIndex].Cells[2].FindControl("TextBoxSigla"); string sigla = valor2.Text; TextBox valor3 = (TextBox)GridViewProduto.Rows[e.RowIndex].Cells[3].FindControl("TextBoxLink"); string link = valor3.Text; CheckBox valor4 = (CheckBox)GridViewProduto.Rows[e.RowIndex].Cells[4].FindControl("CheckBoxStatus"); bool status = valor4.Checked; string nome = daop.atualiza_produto(codigo, nome_produto, sigla, link, status); if (nome.Equals("ok")) { DataTable dt =(DataTable)Session["dadosProdutos"]; dt.DefaultView[e.RowIndex].Row["cod_produto"] = codigo; dt.DefaultView[e.RowIndex].Row["nom_produto"] = nome_produto; dt.DefaultView[e.RowIndex].Row["des_sigla"] = sigla; dt.DefaultView[e.RowIndex].Row["des_link"] = link; dt.DefaultView[e.RowIndex].Row["log_ativo"] = status; GridViewProduto.EditIndex = -1; AtualizarGrid(false); LabelError6.Visible = false; } else { LabelError6.Text = "Já existe um produto cadastro com o nome de" + nome; LabelError6.Visible = true; } } protected void GridViewProduto_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { GridViewProduto.EditIndex = -1; AtualizarGrid(false); LabelError6.Visible = false; } protected void Button1_Click(object sender, EventArgs e) { ModalPopupExtender1.Show(); Panel1.Visible = true; } // RegisterStartupScript //ClientScript.RegisterStartupScript( protected void Button2_Click(object sender, EventArgs e) { LabelError.Visible = false; if (valida_sigla()) { LabelErrorSigla.Visible = false; bool status = false; if (CheckBoxStatus1.Checked == true) { status = true; } else { status = false; } int codigo = daop.insere_produto(TextBoxNome1.Text, TextBoxSigla1.Text, TextBoxLink1.Text, status); if (codigo > 0) { LabelError.Visible = false; insereProduto_table(codigo, TextBoxNome1.Text, TextBoxSigla1.Text, TextBoxLink1.Text, status); AtualizarGrid(false); limpaCampos(); } else { LabelError.Visible = true; ModalPopupExtender1.Show(); //ClientScript.RegisterStartupScript(GetType(), "msgAlertaEmailOK", Util.ScriptAlerta("Produto já existe!")); //limpaCampos(); } } else { LabelErrorSigla.Visible = true; ModalPopupExtender1.Show(); } } private void insereProduto_table(int codigo, string nome, string sigla, string link, bool status) { DataTable dt = (DataTable)Session["dadosProdutos"]; DataRow registro = dt.NewRow(); registro["cod_produto"] = codigo; registro["nom_produto"] = nome; registro["des_sigla"] = sigla; registro["des_link"] = link; registro["log_ativo"] = status; dt.Rows.Add(registro); Session["dadosProdutos"] = dt; } public bool valida_sigla() { if (TextBoxSigla1.Text.Length < 3) { //ClientScript.RegisterStartupScript(GetType(), "msgAlertaEmailOK", Util.ScriptAlerta("O campo sigla deve conter 3 caracteres!")); return false; } else { return true; } } public void limpaCampos() { TextBoxNome1.Text = ""; TextBoxSigla1.Text = ""; TextBoxLink1.Text = ""; CheckBoxStatus1.Checked = false; LabelErrorSigla.Visible = false; LabelErrorSigla.Visible = false; } protected void Button3_Click(object sender, EventArgs e) { Panel1.Visible = true; ModalPopupExtender1.Show(); } protected void ButtonCancelar_Click(object sender, EventArgs e) { limpaCampos(); Panel1.Dispose(); } protected void ImageButton1_Click(object sender, ImageClickEventArgs e) { AtualizarGrid(true); } protected void GridViewProduto_Sorting(object sender, GridViewSortEventArgs e) { DataTable dt = (DataTable)Session["dadosProdutos"]; if ((dt.DefaultView.Sort.Trim().Equals(string.Empty)) || (!dt.DefaultView.Sort.Trim().StartsWith(e.SortExpression.Trim()))) { ViewState["ordemProdutos"] = "asc"; dt.DefaultView.Sort = e.SortExpression; //dt = (DataTable)Session["dadosProdutos"]; } else { if ((string)ViewState["ordemProdutos"] == "asc") { dt.DefaultView.Sort = e.SortExpression + " desc"; ViewState["ordemProdutos"] = "desc"; //dt = (DataTable)Session["dadosProdutos"]; } else { dt.DefaultView.Sort = e.SortExpression + " asc"; ViewState["ordemProdutos"] = "asc"; // dt = (DataTable)Session["dadosProdutos"]; } } Session["dadosProdutos"] = dt; AtualizarGrid(false); } private void AtualizarGrid(bool forcar) { DataTable dt = null; if ((forcar == true) || (Session["dadosProdutos"] == null)) { dt = daop.Carrega_produto(); Session["dadosProdutos"] = dt; ViewState["ordemProdutos"] = "asc"; } else { dt = (DataTable)Session["dadosProdutos"]; } GridViewProduto.DataSource = dt.DefaultView; GridViewProduto.DataBind(); } } Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Junho 17, 2009 Em qual desses eventos ele joga duas vezes pro Page_Load? Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
Cega86 0 Denunciar post Postado Junho 17, 2009 Quintelab é o seguinte: Na griview eu tenho uma coluna com do tipo command field com um botão edit quando clico nele ele abre mais 2 botões : update e cancel e tudo funciona legal,porém quando clico nesse botão de edit ele passa 2 vezes no page_load e só depois ele vai para o evento GridViewProduto_RowEditing(object sender, GridViewEditEventArgs e) com isso a aplicação fica lenta . O certo seria ele passar pelo page_load uma vez e em seguida ir para o evento GridViewProduto_RowEditing(object sender, GridViewEditEventArgs e). abraço. Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Junho 17, 2009 Então este botão de Edit tem algum evento no código c#? Eu procurei e não encontrei. Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
Macal 0 Denunciar post Postado Junho 18, 2009 Cara, toda ação de postback causa isso. É um "problema" que existe no .NET. Para resolver isso, uso um if no Page Load (quando é necessário). if(!Page.IsPostBack){ faz o que deve ser feito 1 vez. } Por exemplo. As vezes eu tenho que preencher dropdownlist. Ai durante o page load eu preencho, só que quando eu submetia o formulario, a dropdown era preenchida novamente (dobrava o numero de itens). Ai coloquei esse if e a chamada do metodo de preenchimento dentro e resolveu. Compartilhar este post Link para o post Compartilhar em outros sites
Cega86 0 Denunciar post Postado Junho 18, 2009 Ae pessoal descobri qual é o problema trata-se de um bug do asp 2.0 que quando adionamos uma coluna commandfield numa grid podemos escolher se queremos em forma de link,button ou image.Quando usamos link ou button ele da um postback(normal) e quando usamos imagem ocorre esse bug de duplo postback. então eu fiz o seguinte optei por exibir como link e no local onde é pra inserir o texto q vai virar link eu botei um html <img src=../imagens/edit.png> e funcionou perfeitamente agora ele passa pelo postback 1 vez. vlw abaraço. Compartilhar este post Link para o post Compartilhar em outros sites