alphasil Posted May 2, 2008 at 07:32 PM Report Share #183081 Posted May 2, 2008 at 07:32 PM 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 More sharing options...
jpaulino Posted May 2, 2008 at 08:57 PM Report Share #183098 Posted May 2, 2008 at 08:57 PM tabelaRss está declarada como ? Dim tabelaRss As New DataTable Link to comment Share on other sites More sharing options...
alphasil Posted May 2, 2008 at 11:57 PM Author Report Share #183133 Posted May 2, 2008 at 11:57 PM 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 More sharing options...
jpaulino Posted May 3, 2008 at 07:49 AM Report Share #183141 Posted May 3, 2008 at 07:49 AM Mas tu tens de criar uma nova datatable Private tabelaRss As New DataTable Link to comment Share on other sites More sharing options...
alphasil Posted May 3, 2008 at 12:27 PM Author Report Share #183162 Posted May 3, 2008 at 12:27 PM 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 More sharing options...
jpaulino Posted May 3, 2008 at 02:40 PM Report Share #183183 Posted May 3, 2008 at 02:40 PM 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 More sharing options...
alphasil Posted May 3, 2008 at 07:11 PM Author Report Share #183235 Posted May 3, 2008 at 07:11 PM 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 More sharing options...
jpaulino Posted May 3, 2008 at 07:58 PM Report Share #183238 Posted May 3, 2008 at 07:58 PM 😉 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 More sharing options...
alphasil Posted May 3, 2008 at 08:14 PM Author Report Share #183244 Posted May 3, 2008 at 08:14 PM Oi amigo Vou experimentar isso logo a noite, amanha digo.te alguma coisa Birgadão pela ajuda cumps gmc11 Link to comment Share on other sites More sharing options...
alphasil Posted May 4, 2008 at 02:43 PM Author Report Share #183288 Posted May 4, 2008 at 02:43 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now