Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Cega86

[Resolvido] passando pelo pageload 2 vezes

Recommended Posts

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, 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 é 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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.