Jump to content
kombypetras

Duvida com datagrid

Recommended Posts

kombypetras

Boas Pessoal.

<Custom:DataGrid Margin="0,0,0,60" Height="357" Width="615" x:Name="dgrid1"
			RowDetailsVisibilityMode="VisibleWhenSelected"
			HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" 
			SelectionMode="Extended" CanUserReorderColumns="True" CanUserResizeColumns="False" 
			CanUserSortColumns="True" AutoGenerateColumns="False"
			CanUserResizeRows="False"
			CanUserAddRows="False" CanUserDeleteRows="False"
			CellStyle="{StaticResource cellStyle}"
			ColumnHeaderStyle="{StaticResource columnHeaderStyle}" 
			RowStyle="{StaticResource rowStyle}" 
			BorderBrush="{x:Null}" Foreground="{x:Null}"
			HorizontalGridLinesBrush="#FF140B70" VerticalGridLinesBrush="#FF140B70" 
			HeadersVisibility="Column" TextBlock.TextAlignment="Center"
			Background="#00000000" MaxHeight="340" MaxWidth="610" 
			d:LayoutOverrides="GridBox"
			HorizontalContentAlignment="Center" VerticalContentAlignment="Center">
			<Custom:DataGrid.Columns>
				<Custom:DataGridTextColumn Header="Especialidade" Width="130" />
				<Custom:DataGridTextColumn Header="Preço Seco" Width="100"  />
					<Custom:DataGridTextColumn Header=" " Width="20"  />
				<Custom:DataGridTextColumn Header="Comissão" Width="80" />
				<Custom:DataGridTextColumn Header="Valor Ganho" Width="80"  />
					<Custom:DataGridTextColumn Header="Lucro" Width="80"  />
					<Custom:DataGridTextColumn Header="Preço Cliente" Width="100"  />
			</Custom:DataGrid.Columns>
		</Custom:DataGrid>

Tenho o seguinte código para defenir uma DataGrid.

Depois o que eu quero é que dadas umas informações pelo utilizador sejam preenchidas algumas colunas e as outras fiquem em branco para o utilizador poder preencher.

O meu problema é que eu nao consigo fazer isso. Já tentei criar uma DataTable mas continua a nao me dar nada.

Se alguém me consegui-se ajudar era bom.

Já agora como introduzir checkbox numa das colunas e depois verificar quais os que estão seleccionados??

Agradeço uma ajudinha.

Share this post


Link to post
Share on other sites
saramgsilva

Boas,

pedia-te para veres os seguintes links:

WPF DataGrid Control

WPF Toolkit: DataGrid Feature Walkthrough

Com estes exemplos penso que irás clarificar os teus problemas.

Já agora como introduzir checkbox numa das colunas e depois verificar quais os que estão seleccionados??

Tens que usar uma DataGridCheckBoxColumn

Share this post


Link to post
Share on other sites
kombypetras

Olá Sara.

Sim isso ajudou. Mas continuo com o meu problema.

A ver se me consigo explicar.

Na tabela tenho várias especialidades que estão guardadas numa lista e que foram escolhidas previamente.

O que quero é que as especialidades guardadas na lista sejam introduzidas na datagrid com os outros atributos vazios.

Pelo que percebi de uma pesquisas que efectuei é que tenho que criar uma datatable para introduzir os dados na datagrid mas continua sem funcionar a maneira como criei a datatable.

Share this post


Link to post
Share on other sites
kombypetras

Boas já consegui resolver metade do meu problema.

Consigo construir a tabela mas a informação não me aparece na DataGrid.

Construí a tabela da seguinte maneira.

...
...
...
DataRow row;
            dt1 = new DataTable();
            dt1.Columns.Add(new DataColumn("Especialidade"));
            dt1.Columns.Add(new DataColumn("Preço Seco", typeof(String)));
            dt1.Columns.Add(new DataColumn("V", typeof(bool)));
            dt1.Columns.Add(new DataColumn("Comissão", typeof(String)));
            dt1.Columns.Add(new DataColumn("Valor Ganho", typeof(String)));
            dt1.Columns.Add(new DataColumn("Lucro", typeof(String)));
            dt1.Columns.Add(new DataColumn("Preço Cliente", typeof(String)));
            for (int i = 0; i < listaesp.Count; i++)
            {
                row = dt1.NewRow();
                row["Especialidade"] = listaesp[i].ToString();
                row["Preço Seco"] = "";
                row["V"] = false;
                row["Comissão"] = "";
                row["Valor Ganho"] = "";
                row["Lucro"] = "";
                row["Preço Cliente"] = "";
                dt1.Rows.Add(row);

...
...
...

dgrid1.ItemSource = dt1.DefaultView;

se alguem conseguir dizer me porque agradeço.

Já testei com outros valores e continua a não dar nada.

Share this post


Link to post
Share on other sites
saramgsilva

Olá Sara.

Sim isso ajudou. Mas continuo com o meu problema.

A ver se me consigo explicar.

Na tabela tenho várias especialidades que estão guardadas numa lista e que foram escolhidas previamente.

O que quero é que as especialidades guardadas na lista sejam introduzidas na datagrid com os outros atributos vazios.

Pelo que percebi de uma pesquisas que efectuei é que tenho que criar uma datatable para introduzir os dados na datagrid mas continua sem funcionar a maneira como criei a datatable.

Falta-te o binding nas colunas, onde fazes a ligação entre o Source e o Target. Vê os exemplos que te enviei.

Share this post


Link to post
Share on other sites
kombypetras

Boas Sara.

Obrigado pela ajuda. já descobri qual o erro.

Eu tinha o Binding so que tinha um pequeno erro.

Obrigado pela ajuda.

Share this post


Link to post
Share on other sites
kombypetras
<Custom:DataGrid>
			<Custom:DataGrid.Columns>
				<Custom:DataGridTextColumn Header="Especialidade" IsReadOnly="True" Binding="{Binding Especialidade}" Width="130" />
				<Custom:DataGridTextColumn Header="Preço Seco" Binding="{Binding precoseco}" Width="100"  />
                    <Custom:DataGridCheckBoxColumn Header="V" Binding="{Binding CheckBox}" Width="10"  />
				<Custom:DataGridTextColumn Header="Comissão" Binding="{Binding comissao}" Width="80" />
				<Custom:DataGridTextColumn Header="Valor Ganho" Binding="{Binding ganho}" Width="80"  />
                    <Custom:DataGridTextColumn Header="Lucro" Binding="{Binding lucro}" Width="80"  />
                    <Custom:DataGridTextColumn Header="Preço Cliente" Binding="{Binding precocliente}" Width="100" />
			</Custom:DataGrid.Columns>
		</Custom:DataGrid>
------------------------------------------------------------------------------------------------------------------------------

DataRow row;
            dt1 = new DataTable();
            dt1.Columns.Add(new DataColumn("Especialidade"));
            dt1.Columns.Add(new DataColumn("Preço Seco", typeof(String)));
            dt1.Columns.Add(new DataColumn("V", typeof(bool)));
            dt1.Columns.Add(new DataColumn("Comissão", typeof(String)));
            dt1.Columns.Add(new DataColumn("Valor Ganho", typeof(String)));
            dt1.Columns.Add(new DataColumn("Lucro", typeof(String)));
            dt1.Columns.Add(new DataColumn("Preço Cliente", typeof(String)));
            for (int i = 0; i < listaesp.Count; i++)
            {
                row = dt1.NewRow();
                row["Especialidade"] = listaesp[i].ToString();
                row["Preço Seco"] = "";
                row["V"] = false;
                row["Comissão"] = "";
                row["Valor Ganho"] = "";
                row["Lucro"] = "";
                row["Preço Cliente"] = "";
                dt1.Rows.Add(row);
            }


Share this post


Link to post
Share on other sites
rick3n

Eu tenho algo do género e também não estou a conseguir, eu estou a ler um xml directamente para um dataset, a minha ideia é ter 2 datagrids:

o 1 mostra o conteudo do ficheiro xml como ele vem formatado

o 2 mostra-me as diferenças de 2 datas que estou a comparar

Basicamente não estou a conseguir mostrar as diferenças no 2 datagrid.

O dataset origem esta a ser convertido para um datatable, que por sua vez depois percorro as colunas para depois no datatable destino ter exactamente as mesmas colunas:

1 step:

            
DataSet objDataSet = new DataSet();
objDataSet.ReadXml(caminho);
dataGrid1.DataContext = objDataSet.Tables[0].DefaultView;

2 step

private void button2_Click(object sender, RoutedEventArgs e)
        {
            DataSet objDataSet = new DataSet();
            objDataSet.ReadXml(caminho);
            DataTable dtoriginal = (DataTable)objDataSet.Tables[0];
            DataTable dtdestino = new DataTable();
            DataColumn dt;
            foreach (DataColumn dtc in dtoriginal.Columns)
            {
                dt = new DataColumn(dtc.ColumnName);
                dtdestino.Columns.Add(dt);
            }

3 Step

DataRow dr1;

            foreach (DataRow dr in objDataSet.Tables[0].Rows)
            {
                try
                {

                    numIt = Convert.ToInt32(dr["ITINERARIE_NUMBER"]);
                    numRt = Convert.ToInt32(dr["ROUTE_ID"]);
                    numCl = Convert.ToInt32(dr["CYCLE_NUMBER"]);
                    dtheorS = dr["DATE_THEOR"].ToString();
                    dtleitS = dr["DATE_READING"].ToString();
                    data = null;
                    data = dtheorS.Split('.');
                    dtheor = new DateTime(Convert.ToInt32(data[0]), Convert.ToInt32(data[1]), Convert.ToInt32(data[2]));
                    data = null;
                    data = dtleitS.Split('.');
                    dtleit = new DateTime(Convert.ToInt32(data[0]), Convert.ToInt32(data[1]), Convert.ToInt32(data[2]));

                    TimeSpan t = dtleit.Subtract(dtheor);

                    if (t.Days > numDias)
                    {
                        listBox1.Items.Add(numIt.ToString());

                        dtdestino.Rows.Add(dr);
                    }
                }
                catch
                {
                    //MessageBox.Show("teste", "Erro");
                }

                dataGrid2.ItemsSource = dtdestino.DefaultView;

Têm ideia? é que eu não estou usar bindings nem nada do genero.

Share this post


Link to post
Share on other sites
saramgsilva

Eu tenho algo do género e também não estou a conseguir, eu estou a ler um xml directamente para um dataset, a minha ideia é ter 2 datagrids:

o 1 mostra o conteudo do ficheiro xml como ele vem formatado

o 2 mostra-me as diferenças de 2 datas que estou a comparar

Basicamente não estou a conseguir mostrar as diferenças no 2 datagrid.

O dataset origem esta a ser convertido para um datatable, que por sua vez depois percorro as colunas para depois no datatable destino ter exactamente as mesmas colunas:

1 step:

            
DataSet objDataSet = new DataSet();
objDataSet.ReadXml(caminho);
dataGrid1.DataContext = objDataSet.Tables[0].DefaultView;

2 step

private void button2_Click(object sender, RoutedEventArgs e)
        {
            DataSet objDataSet = new DataSet();
            objDataSet.ReadXml(caminho);
            DataTable dtoriginal = (DataTable)objDataSet.Tables[0];
            DataTable dtdestino = new DataTable();
            DataColumn dt;
            foreach (DataColumn dtc in dtoriginal.Columns)
            {
                dt = new DataColumn(dtc.ColumnName);
                dtdestino.Columns.Add(dt);
            }

3 Step

DataRow dr1;

            foreach (DataRow dr in objDataSet.Tables[0].Rows)
            {
                try
                {

                    numIt = Convert.ToInt32(dr["ITINERARIE_NUMBER"]);
                    numRt = Convert.ToInt32(dr["ROUTE_ID"]);
                    numCl = Convert.ToInt32(dr["CYCLE_NUMBER"]);
                    dtheorS = dr["DATE_THEOR"].ToString();
                    dtleitS = dr["DATE_READING"].ToString();
                    data = null;
                    data = dtheorS.Split('.');
                    dtheor = new DateTime(Convert.ToInt32(data[0]), Convert.ToInt32(data[1]), Convert.ToInt32(data[2]));
                    data = null;
                    data = dtleitS.Split('.');
                    dtleit = new DateTime(Convert.ToInt32(data[0]), Convert.ToInt32(data[1]), Convert.ToInt32(data[2]));

                    TimeSpan t = dtleit.Subtract(dtheor);

                    if (t.Days > numDias)
                    {
                        listBox1.Items.Add(numIt.ToString());

                        dtdestino.Rows.Add(dr);
                    }
                }
                catch
                {
                    //MessageBox.Show("teste", "Erro");
                }

                dataGrid2.ItemsSource = dtdestino.DefaultView;

Têm ideia? é que eu não estou usar bindings nem nada do genero.

Boas, pedia-te para melhorares um pouco o teu código, está confuso e penso que não esta correcto. Eu no inicio deste tópico apresentei exemplos, pedia-te para os analisares e estudares um pouco, decerto que te irão ajudar.

Share this post


Link to post
Share on other sites
rick3n

Boas eu não colei ai o codigo todo, e sem perceber o negocio que ai está pode ser complicado perceber o que se pretende.

De qualquer forma ja resolvi o problema.

Antes:

                    if (t.Days > numDias)
                    {
                        listBox1.Items.Add(numIt.ToString());

                        dtdestino.Rows.Add(dr);

Depois:

                        if (t.Days > numDias)
                        {
                            dr1 = dtdestino.NewRow();
                            foreach (DataColumn dtc in dtdestino.Columns)
                            {
                                dr1[dtc.ColumnName] = dr[dtc.ColumnName];
                            }
                            dtdestino.Rows.Add(dr1);
                        }

Share this post


Link to post
Share on other sites
kombypetras

Boas Pessoal sugiu-me a seguinte dúvida.

Actualmente tenho a minha DataGrid definida da seguinte maneira.

<Custom:DataGrid
                Margin="0,0,0,60" Height="417" Width="610" x:Name="dgrid1"
			RowDetailsVisibilityMode="VisibleWhenSelected"
			HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" 
			SelectionMode="Single"  CanUserReorderColumns="True" CanUserResizeColumns="False" 
			CanUserSortColumns="False" AutoGenerateColumns="False"
			CanUserResizeRows="False" SelectionUnit="Cell"
			CanUserAddRows="False" CanUserDeleteRows="True" FontSize="14"
			HorizontalGridLinesBrush="#FF140B70" VerticalGridLinesBrush="#FF140B70" 
			HeadersVisibility="Column" TextBlock.TextAlignment="Center"
			Background="#00000000" MaxHeight="340" MaxWidth="615" 
			d:LayoutOverrides="GridBox" HorizontalContentAlignment="Center">
            <Custom:DataGrid.Columns>
                <Custom:DataGridTextColumn Header="Especialidade" IsReadOnly="True" Binding="{Binding Especialidade}" Width="130" />
                <Custom:DataGridTextColumn Header="Preço Seco" Binding="{Binding precoseco}" Width="100"  />
                <Custom:DataGridCheckBoxColumn Header="V" Binding="{Binding CheckBox}" Width="10"  />
                <Custom:DataGridTextColumn Header="Comissão" Binding="{Binding comissao}" Width="80" />
                <Custom:DataGridTextColumn Header="Valor Ganho" Binding="{Binding ganho}" Width="80"  />
                <Custom:DataGridTextColumn Header="Lucro" Binding="{Binding lucro}" Width="80"  />
                <Custom:DataGridTextColumn Header="Preço Cliente" Binding="{Binding precocliente}" Width="100" />
            </Custom:DataGrid.Columns>
        </Custom:DataGrid>

O que eu quero é o seguinte.

Quero que ao ser mostrada a tabela ao utilizador este possa alterar ou introduzir os valores nuns deteminados campos da datagrid.

Ou seja se na tabela eu estiver a alterar o campo do lucro ele escreve mas ao mudar de célula ou se eu confirmar esse valor desaparece.

Agradecia uma ajuda para eu esclarecer esta situação.

Share this post


Link to post
Share on other sites
saramgsilva

Faz o seguinte, no set de umas propriedades que podes editar coloca um breakpoint e verifica se o valor é alterado, está relacionado com o updatesourcetrigger do binding.

Caso o valor seja alterado no set, como o que foi alterada na edição e na datagrid aparece o valor antigo, é porque te falta a implementação da interface INotifyPropertyChanged, verifica isso!

O exemplo que te dei no meu primeiro post inclui código, talvez fosse interessante analisar o que eles fazem.

Share this post


Link to post
Share on other sites
kombypetras

Boas Sara.

Isto só dá fazendo uma classe que implementa o INotifyPropertyChanged?

Não há nenhuma propriedade que faça com que os valores fiquem guardados na DataGrid?

Fiquei um pouco confuso com o que li sobre essa propriedade e com os exemplos não consegui resolver o problema?

Share this post


Link to post
Share on other sites
saramgsilva

Boas Sara.

Isto só dá fazendo uma classe que implementa o INotifyPropertyChanged?

Não há nenhuma propriedade que faça com que os valores fiquem guardados na DataGrid?

Fiquei um pouco confuso com o que li sobre essa propriedade e com os exemplos não consegui resolver o problema?

Tu estás a usar um binding que fará a ligação entre o source(o teu ojecto) e o target (coluna) e é necessário a implementação do INotifyPropertyChanged para depois serem displutadas as notificações de alteração, senão como é que achas que é feito atribuição do novo valor?

Vês o exemplo da implementação da interface: INotifyPropertyChanged Interface

Share this post


Link to post
Share on other sites
kombypetras

Boas Sara.

Já consegui resolver o meu problema.

Só que agora estou com um problema que não estou a conseguir resolver e não encontro solução.

A situação é a seguinte se o utilizador alterar o valor numa célula queria que a cada valor que ele digita seja alterado o valor noutro objecto.

Exemplo ter um evento que ao digitar uma tecla modifica o valor de um textbox para o valor que está na célula a datagrid.

Desculpa lá estar a incomodar.

Desde já agradeço a tua disponibilidade para ajudar.

Share this post


Link to post
Share on other sites
saramgsilva

Na primeira coluna que alteras, dizes que o binding vai ter de updatesourcetrigger propertychanged, implica que cada vez que digitares algo a propriedade seja alterado.

Na coluna que queres reflectir a alteração, deves ter um binding associado.

Agora ou fazes:

1. na propriedade que estás a alterar, no set fazes actualização da variável da 2coluna ( esta tem que fazer displutar o PropertyChanged)

2. o binding da 2 coluna depender do binding da primeira coluna.

eu faria a 1ª opção.

Acho que é isto.

Share this post


Link to post
Share on other sites
kombypetras

Mas o problema é o evento.

Por exemplo se eu escrever 50 numa célula quero que numa lista que tenho esse valor seja guardado ao mesmo tempo que para finalizar a introdução de um numero o utilizador tecle o Enter ou o Tab

Já tetei o KeyUp e dá-me o valor para onde passa a selecção na tabela e o KeyDown nao está a fazer nada.

Já pesquisei sobre os eventos do dataGrid e não consegui associar mais nenhum a esta situação.

Share this post


Link to post
Share on other sites
saramgsilva

Mas o problema é o evento.

Por exemplo se eu escrever 50 numa célula quero que numa lista que tenho esse valor seja guardado ao mesmo tempo que para finalizar a introdução de um numero o utilizador tecle o Enter ou o Tab

Já tetei o KeyUp e dá-me o valor para onde passa a selecção na tabela e o KeyDown nao está a fazer nada.

Já pesquisei sobre os eventos do dataGrid e não consegui associar mais nenhum a esta situação.

eu acho que não tens que usar nenhum evento e já disse o que devias fazer no meu outro post.

Share this post


Link to post
Share on other sites
kombypetras

Boas Pessoal.

Tenho a seguinte Tabela.

<Custom:DataGrid            
                Margin="2,8,3,25" Width="610" x:Name="dgrid1"
			RowDetailsVisibilityMode="VisibleWhenSelected"
			HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" 
			SelectionMode="Single"  CanUserReorderColumns="True" CanUserResizeColumns="False" 
			CanUserSortColumns="False" AutoGenerateColumns="False"
			CanUserResizeRows="False" SelectionUnit="Cell"
			CanUserAddRows="False" CanUserDeleteRows="True" FontSize="14"
			HeadersVisibility="Column" TextBlock.TextAlignment="Center"
			Background="#00000000" MaxHeight="382" MaxWidth="610" 
			d:LayoutOverrides="GridBox" HorizontalContentAlignment="Center" 
            VerticalAlignment="Top" VerticalContentAlignment="Center"
            Height="382" KeyUp="dgrid1_KeyUp" MouseUp="dgrid1_MouseDown">
            <Custom:DataGrid.Columns>
                <Custom:DataGridTextColumn Header="Especialidade" IsReadOnly="True"
					Binding="{Binding Especialidade}" Width="120" />
                <Custom:DataGridTextColumn Header="Fornecedor" IsReadOnly="True"
					Binding="{Binding Fornecedor}" Width="120" />
                <Custom:DataGridTextColumn Header="Preço Seco"
					Binding="{Binding PSeco}" Width="90" />
                <Custom:DataGridCheckBoxColumn Header="C"
					Binding="{Binding C}" Width="10" IsReadOnly="True"/>
                <Custom:DataGridTextColumn Header="P_%"
					Binding="{Binding p1}" Width="40" IsReadOnly="True"/>
                <Custom:DataGridTextColumn Header="P_€"
					Binding="{Binding p2}" Width="60" IsReadOnly="True"/>
                <Custom:DataGridTextColumn Header="Lucro"
					Binding="{Binding lucro}" Width="60" />
                <Custom:DataGridTextColumn Header="Preço Cliente"
					Binding="{Binding PCliente}" Width="90" IsReadOnly="True"/>
            </Custom:DataGrid.Columns>
        </Custom:DataGrid>

E o que eu quero é o seguinte.

1º -> Se o utilizador escolher uma checkbox como true numa determinada linha aceita os valores mas se a checkbox estiver a false e o utilizador escrever um valor na coluna P_% e P_€ queria que ao mudar de célula na mesma linha o valor não altera-se e se mantive-se a 0.

2º -> Se o utilizador escrever valores numas céluas  muda na célula da ultima coluna ao carregar no tab.

Eu tenho o seguinte código.

só que só mostra os valores alterados na tabela quando muda de linha ou quando efectuar uma outra acção fora da DataGrid.

public void AlteravaloresTabela()
        {
            if (dgrid1.CurrentItem != null)
            {
                for (int i = 0; i < dgrid1.Items.Count; i++)
                {
                    drv = (DataRowView)dgrid1.Items[i];
                    listatabela[i].PSeco = double.Parse(drv[2].ToString());
                    listatabela[i].Comissao = bool.Parse(drv[3].ToString());
                    listatabela[i].Perc = double.Parse(drv[4].ToString());
                    listatabela[i].Valor = double.Parse(drv[5].ToString());
                    listatabela[i].Lucro = double.Parse(drv[6].ToString());
                    listatabela[i].PCliente = double.Parse(drv[7].ToString());
                    if (listatabela[i].Comissao == false)
                    {
                        drv[4] = 0;
                        drv[5] = 0;
                        listatabela[i].PSeco = double.Parse(drv[2].ToString());
                        listatabela[i].Comissao = bool.Parse(drv[3].ToString());
                        listatabela[i].Perc = 0;
                        listatabela[i].Valor = 0;
                        listatabela[i].Lucro = double.Parse(drv[6].ToString());
                        listatabela[i].PCliente = double.Parse(drv[7].ToString());
                    }
                    listatabela[i].PCliente = listatabela[i].PSeco +
                        listatabela[i].Valor +
                        listatabela[i].Lucro;
                    drv[7] = listatabela[i].PCliente;
                }
            }
        }

        private void dgrid1_KeyUp(object sender, KeyEventArgs e)
        {
            if (Key.Enter == e.Key || Key.Tab == e.Key)
            {
                AlteravaloresTabela();
            }
        }

        private void dgrid1_MouseDown(object sender, MouseButtonEventArgs e)
        {
            AlteravaloresTabela();
        }

se alguem tiver uma ideia para eu resolver esta situação agradecia.

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

×
×
  • 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.