Ir para conteúdo

POWERED BY:

Arquivado

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

felipe maricato moura

[Resolvido] Pegar Indice da Linha da Gridwiew Pai em relação a Gr

Recommended Posts

Cara pode me cobra uma hora tua sei lá aquele lance que agente conversou por tel não funcionou.

 

Caso.

 

Tenho um 3 grids

 

Gv1

Gv2

Gv3

 

A Gv1 tem um campo template que tem a GV2.

 

A GV2 tem um campo template que tem a GV3

 

Fica assim a extrutura de pai para filho

 

GV1 -> GV2 -> GV3

 

Na GV3 eu tenho um evento

 

GridView1_RowCommand(object sender, GridViewCommandEventArgs e)

 

Que os clics de todos os linkbuttons que eu tenho dentro da GV3

 

O atributo

 

e.CommandArgument

 

Contém uma string com o id da linha que eu to clicando na GV3 por exemplo se tiver o valor 3 quer dizer que eu to clicando na linha 4.

 

Mas como saber qual é o índice da linha que a GV3 está. Pois eu posso estar clicando na linha 4 da GV3 que está na linha 0 da GV2 que está na linha 7 da GV1

 

Preciso saber isso por quero encontrar controle dentro da Gridview Pais.

 

Não quero ocupar teu tempo, se precisar cobra pela dica.

 

Obrigado a todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poxa, nunca vi nada parecido.

Eu tenho uma solução, talvez não a mais correta, mas...

E se no CommandArgument você passar assim {0}_{1}_{2}? Onde {0} é o ID da Gv1, o {1} da Gv2 e o {2} é da Gv3.

Outra opção é você extender o componente GridView e adicionar uma propriedade.

 

public int ParentId { get; set; }

Aí quando você criar a grid filho, você seta o Id do pai nesse cara e quando entrar no RowCommand você consegue obter de volta.

 

Espero ter ajudado. Por acaso você pode mostrar uma imagem da tela? Não consigo imaginar esse tipo de layout.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poxa, nunca vi nada parecido.

Eu tenho uma solução, talvez não a mais correta, mas...

E se no CommandArgument você passar assim {0}_{1}_{2}? Onde {0} é o ID da Gv1, o {1} da Gv2 e o {2} é da Gv3.

Outra opção é você extender o componente GridView e adicionar uma propriedade.

 

public int ParentId { get; set; }

Aí quando você criar a grid filho, você seta o Id do pai nesse cara e quando entrar no RowCommand você consegue obter de volta.

 

Espero ter ajudado. Por acaso você pode mostrar uma imagem da tela? Não consigo imaginar esse tipo de layout.

 

Obrigado pela resposta

 

Pensei também em concatenar nos três ids como tu falou {0}_{1}_{2} o problema é em que momento ou evento eu faço isso pois em todos que eu tenteni eu não consegui saber a linha anterior para poder fazer a concatenação

 

Sobre externder o grid como funcionaria isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se for usar a concatenação, você terá que fazer na página aspx.

Eu montei mais ou menos como eu imagino que vai ficar seu grid.

Não segui a risca todos as tags pois fiz fora do visual studio, mas acho que da para ter uma idéia.

Você tem algo parecido com isso?

 

<asp:GridView>
	<Columns>
		<asp:DataBound value="<% Bind('IdGrid1')%>">
		<asp:ItemTemplate>
			<Content>
				<asp:GridView>
					<Columns>
						<asp:DataBound value="<% Bind('IdGrid1') %>_<% Bind('IdGrid2') %>">
						<asp:ItemTemplate>
							<Content>
								<asp:GridView>
									<Columns>
										<asp:DataBound value="<% Bind('IdGrid1') %>_<% Bind('IdGrid2')_<% Bind('IdGrid3') %>">
									</Columns>
								</asp:GridView>
							</Content>
						</asp:ItemTemplate>
					</Columns>
				</asp:GridView>
			</Content>
		</asp:ItemTemplate>
	</Columns>
</asp:GridView>

 

Quanto a extender componentes, procure por Web User Control (UC) ou Web Custom Control (CC). Os CC são bem mais trabalhosos, não vale a pena fazer. Os UC são fáceis, achei este tutorial sobre UC, mas não fala sobre extender componentes, não achei nenhum desse tipo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se for usar a concatenação, você terá que fazer na página aspx.

Eu montei mais ou menos como eu imagino que vai ficar seu grid.

Não segui a risca todos as tags pois fiz fora do visual studio, mas acho que da para ter uma idéia.

Você tem algo parecido com isso?

 

<asp:GridView>
	<Columns>
		<asp:DataBound value="<% Bind('IdGrid1')%>">
		<asp:ItemTemplate>
			<Content>
				<asp:GridView>
					<Columns>
						<asp:DataBound value="<% Bind('IdGrid1') %>_<% Bind('IdGrid2') %>">
						<asp:ItemTemplate>
							<Content>
								<asp:GridView>
									<Columns>
										<asp:DataBound value="<% Bind('IdGrid1') %>_<% Bind('IdGrid2')_<% Bind('IdGrid3') %>">
									</Columns>
								</asp:GridView>
							</Content>
						</asp:ItemTemplate>
					</Columns>
				</asp:GridView>
			</Content>
		</asp:ItemTemplate>
	</Columns>
</asp:GridView>

 

Quanto a extender componentes, procure por Web User Control (UC) ou Web Custom Control (CC). Os CC são bem mais trabalhosos, não vale a pena fazer. Os UC são fáceis, achei este tutorial sobre UC, mas não fala sobre extender componentes, não achei nenhum desse tipo.

 

Nesta linha

 

<asp:DataBound value="<% Bind('IdGrid1') %>_<% Bind('IdGrid2')_<% Bind('IdGrid3') %>">

Bind('IdGrid1')

 

IdGrid1 que é o id da grid 1 não serve pois o que eu preciso ter não é o id da grid é sim o id da linha que esta sendo escrita no memento na grid

 

seria algo asim

 

<asp:DataBound value="<% Bind('Id_row_Grid1') %>_<% Bind('Id_row_Grid2')_<% Bind('Id_row_Grid3') %>">

 

Alguem sabe se tem alguma coisa tipo <%# Conteiner.DataIten.CurrentRow %>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa!

 

Eu fiz assim, deu mais trabalho que imaginei http://forum.imasters.com.br/public/style_emoticons/default/pinch.gif

 

Espero que ajude:

 

Default.aspx

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" ShowHeader="false" onrowdatabound="GridView1_RowDataBound">
	<Columns>
		<asp:BoundField DataField="Name"/>
		<asp:TemplateField>
			<ItemTemplate>
				<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="false" ShowHeader="false" onrowdatabound="GridView2_RowDataBound">
					<Columns>
						<asp:BoundField DataField="Numero"/>
						<asp:TemplateField>
							<ItemTemplate>
								<asp:Label ID="Label" runat="server"></asp:Label>
							</ItemTemplate>
						</asp:TemplateField>
					</Columns>
				</asp:GridView>
			</ItemTemplate>
		</asp:TemplateField>
	</Columns>
</asp:GridView>

E meu code-behind assim:

 

public partial class _Default : System.Web.UI.Page
{
	
	protected void Page_Load(object sender, EventArgs e)
	{
		List<Cliente> c = new List<Cliente>();
		Cliente cli = null;
		cli = new Cliente();
		cli.Name = "Joao";
		cli.Pedidos = new List<Pedido>();
		cli.Pedidos.Add(new Pedido() { Numero = "Pedido: 200" });
		cli.Pedidos.Add(new Pedido() { Numero = "Pedido: 242" });
		c.Add(cli);

		cli = new Cliente();
		cli.Name = "Guilherme";
		cli.Pedidos = new List<Pedido>();
		cli.Pedidos.Add(new Pedido() { Numero = "Pedido: 530" });
		cli.Pedidos.Add(new Pedido() { Numero = "Pedido: 6122" });
		c.Add(cli);

		this.GridView1.DataSource = c;
		this.GridView1.DataBind();
	}

	protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
	{
		if (e.Row.RowType == DataControlRowType.DataRow)
		{
			GridView Gv2 = e.Row.FindControl("GridView2") as GridView;
			Cliente c = e.Row.DataItem as Cliente;
			Gv2.DataSource = c.Pedidos;
			Gv2.DataBind();
		}
	}

	protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e)
	{
		if (e.Row.RowType == DataControlRowType.DataRow)
		{
			GridView gv2 = sender as GridView;
			GridViewRow row = gv2.Parent.Parent as GridViewRow;
			Label lbl = e.Row.FindControl("Label") as Label;
			lbl.Text = string.Format("{0}_{1}", row.RowIndex, e.Row.RowIndex);
		}
	}
}

public class Cliente
{
	public string Name { get; set; }
	public List<Pedido> Pedidos { get; set; }
}

public class Pedido
{
	public string Numero { get; set; }
}

Resumindo, não consegui com Bind, eu nunca usei muito, e parece que o que estavamos fazendo não tinha solução. A solução acima usa o evento RowDataBound.

 

[OFF] Quanto mais eu uso grid, mais eu gosto do evento RowDataBound, da pra fazer tudo neste evento http://forum.imasters.com.br/public/style_emoticons/default/joia.gif [/OFF]

Compartilhar este post


Link para o post
Compartilhar em outros sites

vou testar e estudar amanhã ou segunda dou um retorno.

 

valew por hora amigos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom eu estava analisando e é isso mesmo só que tem um problema

 

 

Eu tenho 3 gridviews então eu preciso ter os 3 ids concatenados na ultima

 

por exemplo

 

lbl.Text = string.Format("{0}_{1}", row.RowIndex, e.Row.RowIndex);

 

eu precisaria

 

lbl.Text = string.Format("{0}_{1}_{2}", id_da_linha_gv1, id_da_linha_gv2, id_da_linha_gv3);

 

O problema é que não funciona

 

GridViewRow row = gv2.Parent.Parent.Parent as GridViewRow;

 

não funciona com 3 .Parent.Parent.Parent

 

Alguma idéia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oenning

 

tu tentou fazer com 3 gv e não consegui?

 

o problema é que no evento ROWDATABOUND É EXECUTADO O GV3 DEPOIS DA GV2 DEPOIS DA GV1

 

SENDO ASSIM QUANDO SE ESTÁ PERCORRENDO O GV3 NÃO EXISTE AINDA VALORES DA GV2 E ASSIM TAMBÉM NA GV2 EM RELAÇÃO A GV3

 

Sei lá deve haver outro evento que resolva essa questão sei lá.

 

To achando já que não é possível.

 

Aguarndo retonro

 

abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com duas funcionou?

O evento é executado primeiro para a G1, depois G2 e depois G3.

Então, quando você tiver na G3, você vai ter os valores da G2 e G1.

 

Antes de chegar na GridViewRow você passa pelo GridViewRowCell, por isso acho que falta outro .Parent ali.

 

Assim que eu chegar em casa eu tento montar com três.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se ajuda, funcionou com três grid, inclusive fiz o evento do botão que você precisa.

Crie um novo projeto web e coloque isso:

 

Default.aspx

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" ShowHeader="false"  onrowdatabound="GridView1_RowDataBound">
	<Columns>
		<asp:BoundField DataField="Name"/>
		<asp:TemplateField>
			<ItemTemplate>
				<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="false" ShowHeader="false" onrowdatabound="GridView2_RowDataBound">
					<Columns>
						<asp:BoundField DataField="Numero"/>
						<asp:TemplateField>
							<ItemTemplate>
								<asp:GridView ID="GridView3" runat="server" AutoGenerateColumns="false" ShowHeader="false" onrowdatabound="GridView3_RowDataBound">
									<Columns>
										<asp:BoundField DataField="Nome"/>
										<asp:TemplateField>
											<ItemTemplate>
												<asp:LinkButton ID="LinkButton" Text="Clique Aqui"  runat="server" onclick="LinkButton_Click"></asp:LinkButton>
											</ItemTemplate>
										</asp:TemplateField>
									</Columns>
								</asp:GridView>
							</ItemTemplate>
						</asp:TemplateField>
					</Columns>
				</asp:GridView>
			</ItemTemplate>
		</asp:TemplateField>
	</Columns>
</asp:GridView>
<asp:Label ID="lblValor" runat="server"/>

Default.aspx.cs

public partial class _Default : System.Web.UI.Page
{
	protected void Page_Load(object sender, EventArgs e)
	{
		if (!this.IsPostBack)
		{
			List<Cliente> c = new List<Cliente>();
			Cliente cli = null;
			Pedido p = null;
			cli = new Cliente();
			cli.Name = "Joao";
			cli.Pedidos = new List<Pedido>();
			p = new Pedido();
			p.ItemsPedido = new List<ItemPedido>();
			p.Numero = "Pedido: 200";
			p.ItemsPedido.Add(new ItemPedido() { Nome = "Raquete de Tenis" });
			p.ItemsPedido.Add(new ItemPedido() { Nome = "Bola de Basquete" });
			p.ItemsPedido.Add(new ItemPedido() { Nome = "Violao" });
			cli.Pedidos.Add(p);
			cli.Pedidos.Add(new Pedido() { Numero = "Pedido: 242" });
			c.Add(cli);

			cli = new Cliente();
			cli.Name = "Joao";
			cli.Pedidos = new List<Pedido>();
			p = new Pedido();
			p.ItemsPedido = new List<ItemPedido>();
			p.Numero = "Pedido: 6413";
			p.ItemsPedido.Add(new ItemPedido() { Nome = "Parafuso" });
			cli.Pedidos.Add(p);

			p = new Pedido();
			p.ItemsPedido = new List<ItemPedido>();
			p.Numero = "Pedido: 532";
			p.ItemsPedido.Add(new ItemPedido() { Nome = "Raquete de Tenis" });
			p.ItemsPedido.Add(new ItemPedido() { Nome = "Mesa de Ping-Pong" });
			cli.Pedidos.Add(p);
			c.Add(cli);

			this.GridView1.DataSource = c;
			this.GridView1.DataBind();
		}
	}

	protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
	{
		if (e.Row.RowType == DataControlRowType.DataRow)
		{
			GridView gv2 = e.Row.FindControl("GridView2") as GridView;
			Cliente c = e.Row.DataItem as Cliente;
			gv2.DataSource = c.Pedidos;
			gv2.DataBind();
		}
	}

	protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e)
	{
		if (e.Row.RowType == DataControlRowType.DataRow)
		{
			GridView gv3 = e.Row.FindControl("GridView3") as GridView;
			Pedido p = e.Row.DataItem as Pedido;
			gv3.DataSource = p.ItemsPedido;
			gv3.DataBind();
		}
	}

	protected void GridView3_RowDataBound(object sender, GridViewRowEventArgs e)
	{
		if (e.Row.RowType == DataControlRowType.DataRow)
		{
			GridViewRow rowGv2 = (sender as GridView).Parent.Parent as GridViewRow;
			GridViewRow rowGv1 = rowGv2.Parent.Parent.Parent.Parent as GridViewRow;
			LinkButton lnkBtn = e.Row.FindControl("LinkButton") as LinkButton;
			lnkBtn.CommandArgument = string.Format("{0}_{1}_{2}", rowGv1.RowIndex, rowGv2.RowIndex, e.Row.RowIndex);
		}
	}

	protected void LinkButton_Click(object sender, EventArgs e)
	{
		LinkButton lnk = sender as LinkButton;
		string[] index = lnk.CommandArgument.Split('_');
		this.lblValor.Text = string.Format("Você clico na linha {0} da gv1, {1} da gv2 e {2} da gv3", index[0], index[1], index[2]);
	}
}

public class Cliente
{
	public string Name { get; set; }
	public List<Pedido> Pedidos { get; set; }
}

public class Pedido
{
	public string Numero { get; set; }
	public List<ItemPedido> ItemsPedido { get; set; }
}
public class ItemPedido
{
	public string Nome { get; set; }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu usei o debug para ver acontecendo os eventos na ordem que eles são executados

 

 

no teu código ele faz a seguinte ordem de execução

 

G1 -> G2 -> G3

 

No meu código

 

G3 -> G2 -> G1

 

 

Acredito que a diferença esteja na forma que as grids são populadas eu uso um ODS para cada GRID e tu usa um data source programatico, acredito que deve ser isso.

 

Tu sabe por que funciona desta forma?

 

para resolver o problema tive que usar o rowcomand pois no evento databound da grid 3 eu não tinha os valores aidna sendo assim eu não posso montar por exemplo um HyperLink tenho que ser forçado a usar um LinkButton (que não aber em target=_blank).

 

Bom acho que era isso.

 

Ajudou muito o teu código a chave do problema para mim era rowGv2.Parent.Parent que eu não sabia implementar.

 

Muito obrigado pela ajuda vou repassar essa solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolveu o problema?

Eu particularmente prefiro usar Models, DAOs e popular via código do que usar ObjectDataSource :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi mas tive que usar um link button por que só tinha os valores no comand e não no databound :(

 

Também gosto de popular pelo código mas o ODS tem suas vantagéns quando agente usa paginação.

 

o que seria Models, DAOs.

 

Desculpe a ignorancia

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.