Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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:
Carregando comentários...