Ir para conteúdo

POWERED BY:

Arquivado

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

tiagoborges.net

[Resolvido] Mover registros do ListBox e Atualizar Banco

Recommended Posts

Olá pessoal,

 

Tenho um ListBox com os registros alimentados por consulta a banco de dados (funcional):

 


                   <asp:SqlDataSource ID="sdsMenu" runat="server" ConnectionString="<%$ ConnectionStrings:csMySQL %>" ProviderName="<%$ ConnectionStrings:csMySQL.ProviderName %>" SelectCommand="SELECT tbpaginasmenu.intRegistro, tbpaginas.varcharTitulo FROM tbpaginasmenu INNER JOIN tbpaginas ON tbpaginasmenu.intPagina = tbpaginas.intRegistro ORDER BY tbpaginasmenu.intOrdem" UpdateCommand="UPDATE tbpaginasmenu SET intPagina = @Pagina, intOrdem = @Ordem" />
                   <asp:UpdatePanel ID="upMenu" runat="server">
                       <ContentTemplate>  
                           <asp:Label ID="lResultado" runat="server" Visible="false" />
                           <asp:ListBox ID="lbMenuNovo" runat="server" DataSourceID="sdsMenu" DataTextField="varcharTitulo" DataValueField="intRegistro" SelectionMode="Single" />
                           <asp:Button ID="bSubir" runat="server" Text="↑" />
                           <asp:Button ID="bDescer" runat="server" Text="↓" />
                           <asp:Button ID="bSalvar" runat="server" Text="Salvar" /> |
                           <asp:Button ID="bCancelar" runat="server" Text="Cancelar" />
              	</ContentTemplate>
               </asp:UpdatePanel>

 

Tenho dois botões para navegar com estes registro para cima e para baixo mudando de posição, mas preservando o valor e texto:

 


   Protected Sub bSubir_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bSubir.Click

       'Confere se existe algum registro selecionado
       If lbMenuNovo.SelectedIndex < 0 Then
           'Mensagem de erro
           lbMenuNovo.Focus()
           lResultado.Text = "Para continuar, é preciso selecionar um registro!"
           lResultado.CssClass = "ResultadoErro"
           lResultado.Visible = True
       Else
           'Mover item
           If lbMenuNovo.SelectedIndex > 0 Then
               Dim vRegistro As Integer = lbMenuNovo.SelectedIndex - 1
               Dim vValor As ListItem = lbMenuNovo.SelectedItem
               lbMenuNovo.Items.RemoveAt(lbMenuNovo.SelectedIndex)
               lbMenuNovo.Items.Insert(vRegistro, vValor)
               lbMenuNovo.SelectedIndex = vRegistro
               lResultado.Visible = False
           Else
               lResultado.Text = "Este registro não pode subir!"
               lResultado.CssClass = "ResultadoErro"
               lResultado.Visible = True
           End If
       End If

   End Sub


   Protected Sub bDescer_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bDescer.Click

       'Confere se existe algum registro selecionado
       If lbMenuNovo.SelectedIndex < 0 Then
           'Mensagem de erro
           lbMenuNovo.Focus()
           lResultado.Text = "Para continuar, é preciso selecionar um registro!"
           lResultado.CssClass = "ResultadoErro"
           lResultado.Visible = True
       Else
           'Mover item
           If lbMenuNovo.SelectedIndex < lbMenuNovo.Items.Count - 1 Then
               Dim vRegistro As Integer = lbMenuNovo.SelectedIndex + 2
               Dim vValor As ListItem = lbMenuNovo.SelectedItem
               lbMenuNovo.Items.Insert(vRegistro, vValor)
               lbMenuNovo.Items.RemoveAt(lbMenuNovo.SelectedIndex)
               lbMenuNovo.SelectedIndex = vRegistro - 1
               lResultado.Visible = False
           Else
               lResultado.Text = "Este registro não pode descer!"
               lResultado.CssClass = "ResultadoErro"
               lResultado.Visible = True
           End If
       End If

   End Sub

 

As funções acima estão ok, o problema está com a função salvar, pois seria pra percorrer as novas posições dos registros no ListBox, e atualizar o banco de dados usando o valor do registro no listbox como chave para atualização e a posição como inserindo o novo valor em intOrdem:

 


   Protected Sub bSalvar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bSalvar.Click

       'Verifica se existe algum registro
       If lbMenuNovo.Items.Count > 0 Then
           'Navega pelos registros do ListBox
           For vConta = 0 To lbMenuNovo.Items.Count - 1
               'Atualiza os registros
               Try
                   Dim MySqlCommandUpdate As New MySqlCommand("UPDATE tbpaginasmenu SET intOrdem = @Ordem WHERE intRegistro = @Registro", MySqlConnection)
                   With MySqlCommandUpdate.Parameters
                       .Clear()
                       .Add(New MySqlParameter("@Registro", MySqlDbType.Int16)).Value = lbMenuNovo.Items(vConta).Value
                       .Add(New MySqlParameter("@Ordem", MySqlDbType.Int16)).Value = vConta + 1
                   End With
                   MySqlConnection.Open()
                   MySqlCommandUpdate.ExecuteNonQuery()
               Finally
                   MySqlConnection.Close()
                   MySqlDataReader.Close()
               End Try
           Next
           'Envia o resultado
           lResultado.Text = "Efetuado com sucesso!"
           lResultado.CssClass = "ResultadoSucesso"
           lResultado.Visible = True
       End If

   End Sub

 

 

Conferi no banco de dados e chega a atualizar o primero registro, mas logo em seguida da erro no código na linha MySqlDataReader.Close():

 

 

 

System.NullReferenceException was unhandled by user code

Message=Referência de objeto não definida para uma instância de um objeto.

Source=App_Web_spsc33xm

StackTrace:

em PaineldeControle_Conteudo_Menu_Default.bSalvar_Click(Object sender, EventArgs e) na E:\BACKUP\Documentos\Visual Studio 2010\WebSites\AprendaDigital\PaineldeControle\Conteudo\Menu\Default.aspx.vb:linha 166

em System.Web.UI.WebControls.Button.OnClick(EventArgs e)

em System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)

em System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)

em System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)

em System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)

em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

InnerException:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloque uns breakpoints e mostre a linha que o erro ocorre por favor.

 

No ultimo codigo mostrado, na ação do Salvar_Click, justamente aqui: MySqlDataReader.Close()

Se eu conseguisse fazer funcionar o ReorderList (Ajax) não precisava de nada disto, mas o problema com este é justamente não conseguir mover os dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Se eu conseguisse fazer funcionar o ReorderList (Ajax) não precisava de nada disto, mas o problema com este é justamente não conseguir mover os dados.

Descobri que o problema de eu não conseguir rodar o ReoderList era não ter definido: http://waldyrfelix.net/2011/01/06/gerao-de-ids-mais-eficientes-no-asp-net-4/

 

 

 

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.