Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

electric

[Resolvido] array numa row

Recommended Posts

electric

Boas ppl é o seguinte

Entre outros, tenho este problema,

tenho uma variavel que contem um array e queria colocar esses valores em rows diferentes num grid

parte o codio é

For i = 0 To .runnerPrices.Length - 1
				 With .runnerPrices(i)
					 Back = ""
					 For j = 0 To .bestPricesToBack.Length - 1
						 With .bestPricesToBack(j)
'TablaGrid.Rows(i)("OddBack") = .price

						 End With
					 Next

basicamente assim coloco o valor de .price numa row mas o proximo valor queria colocar na row seguinte da proxima coluna e nao estou a conseguir...

Ja agora, como onsigo por 2 valores numa cell ?

tipo

a= .a &"|"& .b

isto coloca na cell o valor dividido po | mas queria ter tipo um em cima e outro na mesma cel mas em baixo é possivel ??

cumps

Share this post


Link to post
Share on other sites
electric

bem apos 20 visualisações sem resposta provavelmente nao me soube explicar lool

como tal vou expor isto de outra forma xD

se eu tiver uma variavel que tem 9 valores e eu quero colocalos numa tabela 3*3 ou seja

0a | 0b | 0C

1a | 1b | 1c

2a | 2b | 2c

Como o faria ?

Cumprimentos

Share this post


Link to post
Share on other sites
jlpcalado

Olá.

Se a ideia é colocares numa grid uma boa aproximaçãoi será usares uma datatable e fazeres o bind a uma datagridview.

O código que envio exemplifica essa abordagem.

Dim i As Integer
 Dim dt As New DataTable
 Dim dr As DataRow
 dt.Columns.Add("Mês")
 For i = 1 To 31
	 dt.Columns.Add(i.ToString)
 Next
 Dim Month As Integer
 Dim Days As Integer
 For Month = 0 To 11
	 dr = dt.NewRow
	 Days = DateTime.DaysInMonth(Year(Now), Month + 1)
	 dr(0) = Month + 1
	 For i = 1 To Days
		 dr(i) = i
	 Next i
	 dt.Rows.Add(dr)
 Next Month
 dg.DataSource = dt

Outra abordagem é criar um array bidimensional.

O problema é que eles não são direta/ 'bindables' à datagrid.

Será necessário criar as colunas da datagrid por código e adicionar o array linha a linha à datagrid.

Share this post


Link to post
Share on other sites
electric

Desde ja obrigado pela resposta void :)

Eu ja tenho uma datatable criada, o meu grande problema é que os valores no array nao estao a ser colocados correctamente la porque como disse em cima eu tenho um conjunto de 3 colunas para 3 linhas para fazer entao a tabela de 3*3 na mesma variavel, o que nao consigo é polos nesse formato, vou colocar a parte toda do codigo onde ta a duvida:

Cria a tabela:

Dim rowgrid As DataRow
    ' Dim rowgridback As DataRow
    With TablaGrid.Columns 'Set up all columns
        .Add("OddBack")
        .Add("OddLay")
    End With

devia escrever nela!

With mpriceresp
        If .errorCode = BFUK.GetMarketPricesErrorEnum.OK Then
            With .marketPrices
                For i = 0 To .runnerPrices.Length - 1
                    With .runnerPrices(i)
                        Back = ""
                        For j = 0 To .bestPricesToBack.Length - 1
                            With .bestPricesToBack(j)
                                TablaGrid.Rows(i)("OddBack") = .price
                            End With
                        Next

e depois surge o mesmo para outra variavel...

Share this post


Link to post
Share on other sites
electric

Boas, ja consegui resolver essa parte xD ficou desta maneira para quem posa vir a precisar:

With mpriceresp
	 If .errorCode = BFUK.GetMarketPricesErrorEnum.OK Then
		 With .marketPrices
			 For i = 0 To .runnerPrices.Length - 1
				 With .runnerPrices(i)
					 For j = 0 To .bestPricesToBack.Length - 1
						 TablaGrid.Rows(i)("OddBack") = .bestPricesToBack(2).price
						 TablaGrid.Rows(i)("OddBack1") = .bestPricesToBack(1).price
						 TablaGrid.Rows(i)("OddBack2") = .bestPricesToBack(0).price
Next
					 For j = 0 To .bestPricesToLay.Length - 1
						 TablaGrid.Rows(i)("OddLay") = .bestPricesToLay(2).price
						 TablaGrid.Rows(i)("OddLay1") = .bestPricesToLay(1).price
						 TablaGrid.Rows(i)("OddLay2") = .bestPricesToLay(0).price
Next
				 End With
			 Next
		 End With
	 End If
 End With

no entanto continu aqui com uma duvida... agora que tenho isto tudo arranjadinho, como consigo por 2 valores na mesma celula mas um por baixo do outro exemplo:

Ola mundo

ABC

é possivel ?

acabou

Edited by electric

Share this post


Link to post
Share on other sites
electric

Eu aqui todo contente e afinal continue mal...

esta solução que arranjei realmente funciona mas so mesmo para esta selecção que estou a fazer... esquecime de que, cada selecção que eu fizer vai ser diferentes da anterior e como tal isto teria de ser tudo automatico :\ vou partir mais um pouco a cabeça... aradeço ajudas claro :D

Abraços

Share this post


Link to post
Share on other sites
electric

Bem o erro que me da é

Index was outside the bounds of the array.

Pelo que andei a ver quer dizer que nao tenho linhas nenhumas e como tal nao as consegue escrever certo ?

Agora secalhar o melhor para resolver seria sei la dividir esta operação em 2 blocos ?

exemplo

bloco 1 vai sacar os valores

bloco 2 vai colocar os valores na grid

Sera que isto resolveria ?

Imfelizmente tenho de ir trabalhar nao consigo tar aqui mais tempo a testar :(

Abraços

Share this post


Link to post
Share on other sites
jlpcalado

Olá.

Torna-se difícil de perceber o que estás e o que pretendes fazer desconhecendo a estrutura do objecto 'mpriceresp'.

Inicial/ estás a criar 2 colunas na grid, mas no procedimento iniciado com 'With mpriceresp' repara que estás tentar introduzir valores em 6 colunas (!!...)

Deves 'sacar' os valores para as 3 colunas de cada linha e, então, adicionar a linha

...Não é possível por 2 valores na mesma célula óbvia/. Há produtos '3dParties' que disponibilizam rowstyles de fracções para a datagridview ...pagando.

Share this post


Link to post
Share on other sites
electric

Olá.

Torna-se difícil de perceber o que estás e o que pretendes fazer desconhecendo a estrutura do objecto 'mpriceresp'.

Inicial/ estás a criar 2 colunas na grid, mas no procedimento iniciado com 'With mpriceresp' repara que estás tentar introduzir valores em 6 colunas (!!...)

Deves 'sacar' os valores para as 3 colunas de cada linha e, então, adicionar a linha

...Não é possível por 2 valores na mesma célula óbvia/. Há produtos '3dParties' que disponibilizam rowstyles de fracções para a datagridview ...pagando.

Boas,

Sim no fundo sao 6 colunas

- correspondente ao balor a back que tem 3 colunas por 3 celulas e 3 linhas

- correspondente ao valor lay que tem 3 colunas pro 3 celulas e 3 linhas

mas isso neste caso pois podera surgir terem tipo 3 colunas 3 cellulas e umas quantas linhas

o que me estas a sugerir se bem percebi é

criar de antemao as 6 colunas ( ja esta feito logo no inicio e dei um nome a cada coluna obviamente )

e agora "sacar" os valores todos atribuilos a 6 variaveis diferentes e so depois colocalas la ?

Share this post


Link to post
Share on other sites
electric


With TablaGrid.Columns    'Set up all columns
           .Add("SelectionId")
           .Add("Name")
           .Add("OddBack")
           .Add("OddBack1")
           .Add("OddBack2")
           .Add("OddLay2")
           .Add("OddLay1")
           .Add("OddLay")
       End With

mpriceresp = Me.BetFairUK.getMarketPrices(mpricesreq)
    With mpriceresp
	    If .errorCode = BFUK.GetMarketPricesErrorEnum.OK Then
		    With .marketPrices
			    For i = 0 To .runnerPrices.Length - 1
				    With .runnerPrices(i)
					    back = ""
					    For j = 0 To .bestPricesToBack.Length - 1
						    With .bestPricesToBack(j)
							    MsgBox(back & .price)
							    'TablaGrid.Rows(i)("") = back & .price
							    'TablaGrid.Rows(i)("OddBack") = .bestPricesToBack(2).price
							    'TablaGrid.Rows(i)("OddBack1") = .bestPricesToBack(1).price
							    'TablaGrid.Rows(i)("OddBack2") = .bestPricesToBack(0).price
						    End With
					    Next
				    End With
				    With .runnerPrices(i)
					    For j = 0 To .bestPricesToLay.Length - 1
						    '    If .bestPricesToLay.Length > 0 Then
						    'TablaGrid.Rows(i)("OddLay") = .bestPricesToLay(2).price
						    'TablaGrid.Rows(i)("OddLay1") = .bestPricesToLay(1).price
						    'TablaGrid.Rows(i)("OddLay2") = .bestPricesToLay(0).price
						    'End If
					    Next
				    End With
			    Next
		    End With
	    End If
    End With
    DgGrid.DataSource = TablaGrid  'Show the data
    DgGrid.Refresh()

Lembreime de testar e deu resultado...

ou seja coloque a msgbox mostrar o valor back & .price e ele realmente mostra os valores todos certos e na seguinte ordem:

|3|2|1|

|6|5|4|

|9|8|7|

Agora pergunto eu :\ ha maneira de meter isso direcatmente la ? ou seja em vez de mostrar pela msgbox ecrever directamente na grid?

Share this post


Link to post
Share on other sites
jlpcalado

Cria uma datarow derivada da tablagrid

associa os valores à datarow

adiciona a datarow à tablagrid

With TablaGrid.Columns 'Set up all columns
	 .Add("SelectionId")
	 .Add("Name")
	 .Add("OddBack")
	 .Add("OddBack1")
	 .Add("OddBack2")
	 .Add("OddLay2")
	 .Add("OddLay1")
	 .Add("OddLay")
 End With
 Dim dr As DataRow
 mpriceresp = Me.BetFairUK.getMarketPrices(mpricesreq)
 With mpriceresp
	 If .errorCode = BFUK.GetMarketPricesErrorEnum.OK Then
		 With .marketPrices
			 For i = 0 To .runnerPrices.Length - 1
				 dr = TablaGrid.NewRow
				 dr(0) = "valor selectionId"
				 dr(1) = "valor Name"
				 With .runnerPrices(i)
					 back = ""
					 For j = 0 To .bestPricesToBack.Length - 1
						 With .bestPricesToBack(j)
							 dr(j + 2) = back & .price
						 End With
					 Next
				 End With
				 With .runnerPrices(i)
					 For j = 0 To .bestPricesToLay.Length - 1
						 dr(j + 5) = back & .price

					 Next
				 End With
				 TablaGrid.Rows.Add(dr)
			 Next
		 End With
	 End If
 End With
 DgGrid.DataSource = TablaGrid 'Show the data
 DgGrid.Refresh()

Share this post


Link to post
Share on other sites
electric

Muito obrigado jlpcalado,

um dia vou conseguir fazer estas cenas sozinho xD mas ate la ´mt leitura e ajuda :)

tinha ficado em duvida do porke dos

dr(j + 5) = back & .price

j+5 mas ja fikei a saber o que fazem, no entanto tenho outro problema!

é que o selectionid e o name não sao valores que eu coloque a mao! sao valores qye veem de outraas variaveis que tambem sao descarregadas da API, e como tal alterei aqui um pouco a tua receita e ja deu mas, agora criame um quadro com o selectionid e o nome e na linha de baixo é que me da os valores ou seja nao estam na mesma linha...

o segundo problema é que nop primeiro

With .runnerPrices(i)
											 back = ""
											 For j = 0 To .bestPricesToBack.Length - 1
													 With .bestPricesToBack(j)
															 dr(j + 2) = back & .price
													 End With
											 Next
									 End With

esta tudo ok mas os valores estao trocados ou seja esta

|1|2|3| e eu preciso deles em |3|2|1|

ando desde ontem a volta lol ja avancei bastante co ma ajuda de todos mas ainda nao fui a cama lool e agora tenho de ir trabalhar xD logo a noite volto ao ataque

Abraços

Share this post


Link to post
Share on other sites
jlpcalado

A instrução TablaGrid.Rows.Add(dr) adiciona uma linha à tabela - tens que controlar a posição no programa em que é efetuada - claro que deve ser após ter todas as colunas da dr preenchidas.

Em caso de (!!) dúvida coloca os dr(0) e dr(1) imediata/ antes da instrução:

dr(0) = "valor selectionId"

dr(1) = "valor Name"

TablaGrid.Rows.Add(dr)

òbvia/ que nessa altura o programa já deve saber os "valor selectionId" e "valor Name"

Deves controlar, também, a sequência en que introduzes os valores...

na situação que referes basta trocar a definição do ciclo : For j = .bestPricesToBack.Length - 1 to 0 Step -1

Share this post


Link to post
Share on other sites
electric

Bom dia, estive a tentar fazer o que me disseste e até andei a trocar numeros ( a melhor maneira de eu conseguir perceber .. estupido mas é aminha maneira xD ) e nao resolveu eu agora depois de alterar tudo conforme os teus parametros ficou assim:

Sub criatabela()
	TablaGrid.Rows.Clear()
	TablaGrid.Columns.Clear()
	Dim oMarketReq As New BFUK.GetMarketReq	  'Create the request object
	Dim oMarketResp As BFUK.GetMarketResp	'Create a varaible for the response object
	'Dim rowgrid As DataRow
	With TablaGrid.Columns	'Set up all columns
		.Add("SelectionId")
		.Add("Name")
		.Add("OddBack")
		.Add("OddBack1")
		.Add("OddBack2")
		.Add("OddLay2")
		.Add("OddLay1")
		.Add("OddLay")
	End With
	With (oMarketReq)
		.header = FrmLogin.oHeaderUK()
		.marketId = FrmMercado.iddomercado
	End With
	oMarketResp = Me.BetFairUK.getMarket(oMarketReq)	'Call the API (getMarket)
	With oMarketResp					  'Process the response
		FrmLogin.CheckHeader(.header)
		If .errorCode = BFUK.GetMarketErrorEnum.OK Then
			With .market
				For i = 0 To .runners.Length - 1
					dr = TablaGrid.NewRow
					With .runners(i)
						dr(0) = .selectionId
						dr(1) = .name
					End With
					TablaGrid.Rows.Add(dr)
				Next
			End With
		End If
	End With
	Dim mpricesreq As New BFUK.GetMarketPricesReq
	Dim mpriceresp As New BFUK.GetMarketPricesResp
	With (mpricesreq)
		.header = FrmLogin.oHeaderUK
		.marketId = FrmMercado.iddomercado
	End With
	mpriceresp = Me.BetFairUK.getMarketPrices(mpricesreq)
	With mpriceresp
		If .errorCode = BFUK.GetMarketPricesErrorEnum.OK Then
			With .marketPrices
				For i = 0 To .runnerPrices.Length - 1
					dr = TablaGrid.NewRow
					With .runnerPrices(i)
						back = ""
						For j = .bestPricesToBack.Length - 1 To 0 Step -1
							With .bestPricesToBack(j)
								dr(j + 2) = back & .price
							End With
						Next
					End With
					With .runnerPrices(i)
						lay = ""
						For j = 0 To .bestPricesToLay.Length - 1
							With .bestPricesToLay(j)
								dr(j + 5) = lay & .price
							End With
						Next
					End With
					TablaGrid.Rows.Add(dr)
				Next
			End With
		End If
	End With
	DgGrid.DataSource = TablaGrid  'Show the data
	DgGrid.Refresh()
End Sub

no entanto contiu como tinha antes .... ou seja

|id|name|

|id|name|

|id|name|

|1|2|3|1|2|3

...

isto porque no lay o primeiro é mesmo o num 1 no caso do back como tenho a coluna a fazer este sentido -><- tem de estar ao contrario :\

mais uma vez muito agradecido

vou partir mais um pouco a cabeça... :)

Edited by electric

Share this post


Link to post
Share on other sites
jlpcalado

Atenção!

Numa 1ª fase estás a adicionar 'alhos' - oMarketResp.market.runners(i)

Numa 2ª 'bugalhos' - mpriceresp.marketPrices.runnerPrices(i)

Tens que determinar como é que os 'bugallhos' se relacionam com os 'alhos'.

Como não conheço o modelo da API, numa primeira aproximação é expectável que a 2ª variável (bugalhos) tenha uma propriedade que permita a relação com a propridade 'selectionId' da 1ª (alhos).

Neste caso o ciclo iniciado com With mpriceresp deve correr dentro do ciclo With .runners(i)

Share this post


Link to post
Share on other sites
electric

Bem que dor de cabeça que isto me teem dado ... axo que ja tentei de tudo e nada, coloquei o with mpricesresp dentro do with .runners(i) nada continua a dar acho que um pouco pior porque alem de me colocar:

nome1

prices 1

prices 2

prices 3

nome 2

prices 1

...

Ainda continua a ter a sequencia dos prices errada ou seja em vez de 3 2 1 continua com o 1 2 3

so me apetece desistir mas o meu feito nao me deixa...

Share this post


Link to post
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

×

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.