Jump to content

ComboBox e XML


alphasil
 Share

Recommended Posts

Olá ppl

Gostaria de utilizar uma comboBox onde aparecessem os dados de um XML, isso consigo fazer, o pior é que quero ter a possibildade de adicionar, editar e apagar dados, como faço isso?

o meu xml está assim, é um exemplo

<?xml version="1.0" encoding="utf-8"?>
<BRASIL>
        <ESTADO>
                <Codigo>1</Codigo>
                <Nome>Sao Paulo</Nome>
        </ESTADO>
        <ESTADO>
                <Codigo>2</Codigo>
                <Nome>Rio de Janeiro</Nome>
        </ESTADO>
        <ESTADO>
                <Codigo>3</Codigo>
                <Nome>Minas Gerais</Nome>
        </ESTADO>       
</BRASIL>

O form_load está assim

Dim ds As New DataSet
        ds.ReadXml("Brasil.xml")

        With cboEstado
            .DataSource = ds.Tables("ESTADO")
            .DisplayMember = "Nome"
            .ValueMember = "Codigo"
        End With
Agora o objectivo é criar a possibilidade de acrescentar, apagar ou editar o xml, ja estou à procura mas nada, criei 3 botões um para cada uma das situações, mas não consigo

O código do botão criar é este

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim dr As DataRow = tabelaRss.NewRow()
        Try
            'Verifica se todos os textbox estão preenchidos antes de inserir uma nova linha
            If Not CampoVazio() Then
                'insere a linha
                dr("Nome") = Nome.Text
                dr("URL") = URL.Text

                tabelaRss.Rows.Add(dr)
                MessageBox.Show("O nome " & Nome.Text & " foi incluido com sucesso!", "Aviso")
                alterouRegisto = True
                LimparCampos()
            End If
        Catch exC As System.Data.ConstraintException
            MessageBox.Show("Este nome já está cadastrado. Selecione um novo Nome!", "Aviso")
            LimparCampos()
        Catch ex As Exception
            MessageBox.Show(ex.ToString, "Erro Interno", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
Alguma dica? Dá-me um erro no que marquei a vermelho
Citação

 

System.NullReferenceException was unhandled

  Message="A referência de objecto não foi definida como uma instância de um objecto."

  Source="XML"

gmc11

 

Link to comment
Share on other sites

Oi,

Bigado pela ajuda, o código está axim desde o início. Não deve ser fácil de ler...mas

Que passa com isto?

Imports System.Windows.Forms
Public Class Dialog1
    Private tabelaRss As DataTable  'Tabela que armazena as informações

    Private drEncontrou As DataRow  'Armazena as informações da linha localizada no arquivo XML

    Private dsrss As New DataSet("RSS")    'Cria o DataSet RSS

    Private dvrss As DataView  'Cria o DataView para ordenar os dados

    Private alterouRegisto As Boolean = False   'informa se algum registo sofreu alteração
    Private Function CampoVazio() As Boolean

        'Verifica se todos os campos estão preenchidos

        For Each ctl As Control In Me.GroupBox1.Controls

            If TypeOf ctl Is TextBox Then

                If ctl.Text = String.Empty Then

                    MessageBox.Show("Todos os campos devem estar preenchidos!", "Aviso")

                    Return True

                End If

            End If

        Next

        Return False

    End Function

    Private Sub LimparCampos()

        For Each txt As Control In Me.GroupBox1.Controls

            If TypeOf txt Is TextBox Then

                txt.Text = String.Empty

            End If

        Next


        'Desabilita os botões Alterar e Excluir

        Me.Alterar.Enabled = False

        Me.Apagar.Enabled = False

    End Sub

    Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
        Me.DialogResult = System.Windows.Forms.DialogResult.OK
        Me.Close()
    End Sub

    Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
        Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
        Me.Close()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim dr As DataRow = tabelaRss.NewRow()

        Try

            'Verifica se todos os textbox estão preenchidos antes de inserir uma nova linha

            If Not CampoVazio() Then

                'insere a linha

                dr("Nome") = Nome.Text

                dr("URL") = URL.Text


                tabelaRss.Rows.Add(dr)

                MessageBox.Show("O nome " & Nome.Text & " foi incluido com sucesso!", "Aviso")

                alterouRegisto = True

                LimparCampos()

            End If

        Catch exC As System.Data.ConstraintException

            MessageBox.Show("Este nome já está cadastrado. Selecione um novo Nome!", "Aviso")

            LimparCampos()

        Catch ex As Exception

            MessageBox.Show(ex.ToString, "Erro Interno", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try

    End Sub
    Private Sub Alterar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Alterar.Click

        Try

            'Verifica se todos os textbox estão preenchidos antes de alterar uma linha

            If Not CampoVazio() Then

                drEncontrou.BeginEdit()

                drEncontrou("Nome") = Me.Nome.Text

                drEncontrou("URL") = Me.URL.Text


                drEncontrou.EndEdit()

                MessageBox.Show("O nome " & Nome.Text & " foi alterado com sucesso!", "Aviso")

                alterouRegisto = True

                LimparCampos()

            End If

        Catch ex As Exception

            MessageBox.Show(ex.ToString, "Erro Interno", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try



    End Sub
gmc11

 

Link to comment
Share on other sites

Oi amigo

Mais uma vez obrigado

Já fiz o que me disseste, já ultrapassou aquele erro mas agora dá-me este:

"A coluna Nome não pertence à tabela"

a linha de código que dá erro é a 77 ( dr("Nome") = Nome.Text)

 

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim dr As DataRow = tabelaRss.NewRow()
        Try

            'Verifica se todos os textbox estão preenchidos antes de inserir uma nova linha

            If Not CampoVazio() Then

                'insere a linha

                dr("Nome") = Nome.Text

                dr("URL") = URL.Text


                tabelaRss.Rows.Add(dr)

                MessageBox.Show("O nome " & Nome.Text & " foi incluido com sucesso!", "Aviso")

                alterouRegisto = True

                LimparCampos()

            End If

        Catch exC As System.Data.ConstraintException

            MessageBox.Show("Este nome já está cadastrado. Selecione um novo Nome!", "Aviso")

            LimparCampos()

        Catch ex As Exception

            MessageBox.Show(ex.ToString, "Erro Interno", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try

    End Sub
  
    End Sub

Que se passa agora?

Dsculpa lá mas inda estou a aprender o código....mas mto obrigado pela ajuda que me estás a dar

cumps

gmc11

 

Link to comment
Share on other sites

Desculpa estou um pouco sem tempo. Isto é um exemplo simples de utilização de datatables. Tens de adicionar as colunas primeiro antes de começares a adicionar linhas (rows)

      ' Cria uma nova DataTable e adiciona duas colunas

      Dim dt As New DataTable

      dt.Columns.Add(New DataColumn("id", GetType(Integer)))

      dt.Columns.Add(New DataColumn("nome", GetType(String)))

 

      ' Adiciona as DataRows (linhas)

      Dim dr As DataRow

      For x As Byte = 0 To strNomes.Length - 1

        dr = dt.NewRow()

        dr.Item("id") = x.ToString

        dr.Item("nome") = strNomes(x).ToString

        dt.Rows.Add(dr)

      Next

Foi retirado deste exemplo (http://vbtuga.blogspot.com/2008/04/aspnet-gridview-com-controlos-nas.html) por isso tenta adaptar.

Se não conseguires diz qq coisa que eu mais vejo.

Link to comment
Share on other sites

Oi

Tentei adaptar isso mas não da na msma,

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        ' Verifica se é a primeira vez que a página é actualizada 

        ' (para não repetir sempre que se actualize)

        If Not Page.IsPostBack Then

            Dim strNomes() As String = {"Jorge Miguel", "João Alexandre", "Paulo Jorge", "Rui Sousa", "Carlos Andrade"}

            ' Cria uma nova DataTable e adiciona duas colunas

            Dim dt As New DataTable

            dt.Columns.Add(New DataColumn("id", GetType(Integer)))

            dt.Columns.Add(New DataColumn("nome", GetType(String)))

            ' Adiciona as DataRows (linhas)

            Dim dr As DataRow

            For x As Byte = 0 To strNomes.Length - 1

                dr = dt.NewRow()

                dr.Item("id") = x.ToString

                dr.Item("nome") = strNomes(x).ToString

                dt.Rows.Add(dr)

            Next

            ' Define a DataTable criada com DataSource (fonte de dados da Gridview)

            Me.GridView1.DataSource = dt

            Me.GridView1.DataBind()

        End If
    End Sub
End Class

Estes são os erros que me dá:

Error 1 'IsPostBack' is not a member of 'XML.Page'. 10 16 XML

Error 2 'DataBind' is not a member of 'System.Windows.Forms.DataGridView'. 42 13 XML

gmc11

 

Link to comment
Share on other sites

😉 Mas o exemplo que está no blog é sobre ASP.NET e não VB.NET. É indiquei-te apenas o exemplo pela construção da DataTable.

Desculpa mas eu estava de saida.

Tenta assim:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        
        Try

            'Verifica se todos os textbox estão preenchidos antes de inserir uma nova linha
             If Not CampoVazio() Then

              Dim tabelaRss As New DataTable
              tabelaRss.Columns.Add(New DataColumn("Nome", GetType(String)))
              tabelaRss.Columns.Add(New DataColumn("URL", GetType(String)))

               Dim dr As DataRow
               dr = tabelaRss.NewRow()

                'insere a linha
                dr("Nome") = Nome.Text
                dr("URL") = URL.Text

                tabelaRss.Rows.Add(dr)
                MessageBox.Show("O nome " & Nome.Text & " foi incluido com sucesso!", "Aviso")

                alterouRegisto = True
                LimparCampos()
            End If

        Catch exC As System.Data.ConstraintException
            MessageBox.Show("Este nome já está cadastrado. Selecione um novo Nome!", "Aviso")
            LimparCampos()

        Catch ex As Exception
            MessageBox.Show(ex.ToString, "Erro Interno", MessageBoxButtons.OK, MessageBoxIcon.Error)
         End Try
    End Sub
Link to comment
Share on other sites

Oi amigo

Já fiz tudo, voltei a pôr o código todo mas agora, não aparece o xml, ou seja os dados do xml não aparecem na comboBox. o botão diz que inseriu mas não da nda.

Imports System.Data

Imports System.IO

Public Class Form
    Private tabelaRss As DataTable  'Tabela que armazena as informações

    Private drEncontrou As DataRow  'Armazena as informações da linha localizada no arquivo XML

    Private dsRss As New DataSet("Rss Feader")    'Cria o DataSet Rss Sites

    Private dvRss As DataView  'Cria o DataView para ordenar os dados

    Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Instância a tabela

        tabelaRss = New DataTable("Rss Feader")

        'Cria as colunas

        tabelaRss.Columns.Add("Nome", Type.GetType("System.String"))

        tabelaRss.Columns.Add("Url", Type.GetType("System.String"))


        'Define a coluna Nome como chave primária para não repetir o nome

        'e não permitir que o campo esteja vazio

        tabelaRss.PrimaryKey = New DataColumn() {tabelaRss.Columns("Nome")}

        'Associa a tabela de agenda de telefone ao DataSet

        dsRss.Tables.Add(tabelaRss)

        'Carrega a tabela com os dados do arquivo XML

        If File.Exists("Rss.xml") Then

            dsRss.ReadXml("Rss.xml")

        End If

        'Cria um dataview para ordenar o combobox por Nome

        dvRss = New DataView(tabelaRss)

        dvRss.Sort = "Nome"

        'Carrega o combobox com a lista de nomes cadastrados no arquivo Xml
        With (ComboNome)
            .DataSource = dsRss.Tables("Rss Feader")
            .DisplayMember = "Nome"
        End With

    End Sub
    Private Function CampoVazio() As Boolean

        'Verifica se todos os campos estão preenchidos

        For Each ctl As Control In Me.GroupBox1.Controls

            If TypeOf ctl Is TextBox Then

                If ctl.Text = String.Empty Then

                    MessageBox.Show("Todos os campos devem estar preenchidos!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning)

                    Return True

                End If

            End If

        Next

        Return False

    End Function
    Private Sub LimparCampos()

        For Each txt As Control In Me.GroupBox1.Controls

            If TypeOf txt Is TextBox Then

                txt.Text = String.Empty

            End If

        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            'Verifica se todos os textbox estão preenchidos antes de inserir uma nova linha             
            If Not CampoVazio() Then
                Dim tabelaRss As New DataTable
                tabelaRss.Columns.Add(New DataColumn("Nome", GetType(String)))
                tabelaRss.Columns.Add(New DataColumn("URL", GetType(String)))
                Dim dr As DataRow
                dr = tabelaRss.NewRow()
                'insere a linha                
                dr("Nome") = ComboNome.Text
                dr("URL") = Url.Text
                tabelaRss.Rows.Add(dr)
                MessageBox.Show("O nome " & ComboNome.Text & " foi incluido com sucesso!", "Aviso")
                LimparCampos()
            End If
        Catch exC As System.Data.ConstraintException
            MessageBox.Show("Este nome já está cadastrado. Selecione um novo Nome!", "Aviso")
            LimparCampos()
        Catch ex As Exception
            MessageBox.Show(ex.ToString, "Erro Interno", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
End Class

o XML está assim:

<?xml version="1.0" encoding="utf-8" ?> 
- <SITES>
- <RSS>
  <Codigo>1</Codigo> 
  <Nome>Radio Renascença</Nome> 
  <URL>http://www.rr.pt/Rss/feed.xml</URL> 
  </RSS>
- <RSS>
  <Codigo>2</Codigo> 
  <Nome>RTP</Nome> 
  <URL>http://www.rtp.pt/web/rss/gera_rss.php?tema=</URL> 
  </RSS>
- <RSS>
  <Codigo>3</Codigo> 
  <Nome>TSF</Nome> 
  <URL>http://www.tsf.pt/online/rss/ultimas.xml</URL> 
  </RSS>
- <RSS>
  <Codigo>4</Codigo> 
  <Nome>Sky UK</Nome> 
  <URL>http://www.skypressoffice.co.uk/SkyNews/Help/rssxml.asp</URL> 
  </RSS>
- <RSS>
  <Codigo>5</Codigo> 
  <Nome>CNN</Nome> 
  <URL>http://rss.cnn.com/rss/edition.rss</URL> 
  </RSS>
  </SITES>

Não estou a percebr o porquê...já li e reli o código, tás a ver algum erro??

Cumps e mais 1 vez obrigado

gmc11

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.