Ir para conteúdo
Fórum Script Brasil
  • 0

Índice De Uma Linha No Datagrid. Usando Template.


Nabvchodhonozohr

Pergunta

Olá pessoal!

Estou meio desesperado. Tenho o seguinte problema e não sei se alguém poderia me ajudar: tenho um datagrid. Neste datagrid eu coloquei um TemplateColumn com um linkbutton dentro. Para esse linkbutton eu quero efetuar uma operação no registro corrente. O problema é que eu não estou conseguindo o índice da linha onde está o link button porque a assinatura de delegate do link button exige um Object e um EventArgs como argumentos e não um DataGridCommandEventArgs. Segue um trecho do código abaixo:

'Parte em HTML:

...
<asp:BoundColumn DataField="status" ReadOnly="True" HeaderText="Status"></asp:BoundColumn>
        	<asp:TemplateColumn HeaderText="Mudar Status">
          <ItemTemplate>
          	<asp:LinkButton ID="aprovaOS" OnClick="aprovarOS" Runat=server>Aprovar OS</asp:LinkButton><br>
          	<asp:LinkButton ID="cancelaOS" OnClick="cancelarOS" Runat=server>Cancelar OS</asp:LinkButton>
          </ItemTemplate>
        	</asp:TemplateColumn>
        	<asp:EditCommandColumn HeaderText="Operações" ButtonType=LinkButton CancelText="Cancelar" EditText="Editar OS" UpdateText="Atualizar"></asp:EditCommandColumn>
...
Assinatura do Método aprovarOS q ele me obriga a utilizar:
...
Sub aprovarOS(ByVal s As Object, ByVal e As EventArgs)
   'esse 'e' não me traz o índice da linha corrente
   'a linha abaixo me traz um erro
   e.Item.ItemIndex
...

Na EditCommandColumn eu tenho qualquer informação não de todas as linhas mas da linha q foi clicada.

Como eu vou pegar o índice dessa linha se eu estou usando um linkbutton numa templatecolumn? ou seja, a DataKeyField, a PK q vem do banco? como vou pegá-la?

Valeu.

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

Fala ae, Nab!

E o que tem no "s"? Sei que ele é o Sender, ou seja, o objeto chamador, mas por ele você não tem nada de útil?

É, a gente tá numa correria só, por causa desses projetos... Mas, vou tentar fazer um exemplo aqui desse seu problema e ver se consigo algo (quase não uso ASP.NET, mas entendo um pouco do DataGrid).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Cara eu estou desesperado. Tenho q mostrar alguma coisa pro Pena na quarta pra ele dizer se dá ou não dá pra apresentar o projeto. Tá sinistro.

É o seguinte: 's' me retorna s.GetType (ou seja, não serve pra b*** nenhuma) e o 'e' me retorna e.GetType e e.Empty.

Acho q não ajuda muito né?

Valeu cara.

Abs.

Link para o comentário
Compartilhar em outros sites

  • 0

Cara, dei uma forçada aqui mas ele tá me retornando Nothing. Coloquei isso:

me.dgRel.SelectedItem

e isso:

me.dgRel.SelectedIndex

me retorna -1.

Sinistro!!!

Parece q não tá é selecionando nada. Será q eu vou ter q criar um mecanismo na página q ao clicar no linkbutton ele force uma seleção da linha?

Link para o comentário
Compartilhar em outros sites

  • 0

Consegui fazer assim:

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Put user code to initialize the page here
        Dim dt As New DataTable("Tabela")
        dt.Columns.AddRange(New DataColumn() {New DataColumn("Código", Type.GetType("System.Int32")), New DataColumn("Nome", Type.GetType("System.String"))})
        dt.Rows.Add(New Object() {1, "Junior"})
        dt.Rows.Add(New Object() {2, "Graymalkin"})
        dt.Rows.Add(New Object() {3, "Nab"})
        dt.Rows.Add(New Object() {4, "Jesiel"})

        Dim d As New TemplateColumn
        DataGrid1.Columns.Add(d)
        d.HeaderText = "Confirma?"
        d.ItemTemplate = New ColunaLinkButton
        DataGrid1.DataSource = dt
        DataGrid1.DataBind()
    End Sub

    Public Class ColunaLinkButton
        Implements ITemplate

        Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) Implements System.Web.UI.ITemplate.InstantiateIn
            Dim l As New LinkButton
            l.Text = "Confirmar"

            AddHandler l.Click, AddressOf ColunaLinkButton_Click
            container.Controls.Add(l)
        End Sub

        Public Sub ColunaLinkButton_Click(ByVal sender As Object, ByVal e As EventArgs)
            Dim botão As LinkButton = sender
            Dim célula As TableCell = botão.Parent
            Dim item As DataGridItem = célula.Parent
            Dim página As Page = botão.Page

            página.Response.Write(item.Cells(1).Text)
        End Sub
    End Class
O importante mesmo está na rotina ColunaLinkButton_Click, que é o equivalente ao seu aprovarOS. Veja que eu estou pegando o item da segunda coluna da linha clicada e escrevendo na tela. Seria isso mesmo?
É o seguinte: 's' me retorna s.GetType (ou seja, não serve pra b*** nenhuma)
Claro que serve. Lembre-se que um Object pode conter *qualquer* outro tipo. Você só tem que fazer o cast para o tipo correto (que você pode saber através de s.GetType().ToString()). Veja no exemplo que fiz acima:
Dim botão As LinkButton = sender

Certo? wink.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Pow cara, é isso q eu quero, mas ainda vou ter q gastar um tempo tentando entender o código. Pow, tu tá sinistro em .Net mesmo hein!!!

Valeu cara.

Abraços.

É, estou aprendendo bastante coisa com esse projeto (só isso mesmo que está valendo a pena... biggrin.gif). Mas, o código ali não é difícil de entender não...

           Dim botão As LinkButton = sender
           Dim célula As TableCell = botão.Parent
           Dim item As DataGridItem = célula.Parent
           Dim página As Page = botão.Page

           página.Response.Write(item.Cells(1).Text)

Todo objeto conhece o próprio pai (Parent), ou seja, conhece o objeto que o contém. Como "sender" (Remetente) é quem chamou a rotina, vai ser o próprio LinkButton. O pai dele vai ser uma TableCell, que é uma célula da DataGrid. O pai da TableCell vai ser um DataGridItem que representa uma coleção de TableCells. Encontrando ele, o DataGridItem, bastou pedir a célula desejada para ele. Sacou? wink.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Respondemos ao mesmo tempo. Vou dar uma checada aqui e vejo o q fica melhor. Mas você tá dizendo q através do 's' q é um object eu consigo pegar essa linha?

Não, mas você consegue com o avô de "s" (pai do pai). Dê uma lida no meu post acima.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Putz, desculpa cara. Realmente o q você falou tava na minha frente e eu não vi. O tal 's' me diz tudo sobre o objeto q tá sendo passado e tudo sobre quem o contém. Acho q agora eu consigo.

Pow, valeu cara. Brigadão.

PS: desculpe o incômodo. já estou vendo fogos de artifício de tanto ficar na frente do monitor. hehehe.

Abs.

Link para o comentário
Compartilhar em outros sites

  • 0

Putz, desculpa cara. Realmente o q você falou tava na minha frente e eu não vi. O tal 's' me diz tudo sobre o objeto q tá sendo passado e tudo sobre quem o contém. Acho q agora eu consigo.

Pow, valeu cara. Brigadão.

Sem problemas! biggrin.gif

PS: desculpe o incômodo. já estou vendo fogos de artifício de tanto ficar na frente do monitor. hehehe.

E eu estou quase vegetando aqui... estou vendo a hora que vou cair aqui no chão, babando e me contorcendo... wacko.gif (não vou trabalhar essa semana e nem ir pra faculdade pra terminar esse projeto...)

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...