Jump to content
Sign in to follow this  
Zamparo

[Resolvido] Inserir valor variável double em um DataGridView

Recommended Posts

Zamparo

Olá gostaria de inserir alguns valores em um campo especifico do datagridview, mas não consigo jogar o valor da variável double para do datagridview.

Segue código:

private void bntNormalizar_Click(object sender, EventArgs e)
	{
		int Col = 1;
		for (Col = 1; Col < CargTab.ColumnCount; Col++ )
		{
			int Lin;
			double Valor = 0, Media = 0, Desv = 0;
			DataGridViewRow linha;
			DataGridViewCell celula;
			for (Lin = 0; Lin < CargTab.RowCount; Lin++ )
			{
				linha= CargTab.Rows[Lin];	   //i é o número  da linha seleccionada
				celula = linha.Cells[Col];				   //j é a posição da coluna seleccionada (0 para a primeira e por ai fora)
				Valor += Convert.ToDouble(celula.Value);
			}
			Media = Valor / (Lin - 1);
			Desv = (Valor - Media) * (Valor - Media);
			//ERRO NAS LINHAS ABAIXO
			CargTab.Rows[Lin + 2].Cells[Col].Value = Media;
			CargTab.Rows[Lin + 2].Cells[Col].Value = Desv;
			CargTab.Refresh();
		}

Obrigado

Share this post


Link to post
Share on other sites
nelsonr

Boas,

o erro que dá é que estás a tentar aceder a linhas que não existem?

Não terás que adicionar primeiro essas linhas?

Share this post


Link to post
Share on other sites
Zamparo

Boas,

o erro que dá é que estás a tentar aceder a linhas que não existem?

Não terás que adicionar primeiro essas linhas?

Tentei criar um for para adicionar mais 3 linas porem da o erro:

Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound.

Segue código com o novo for:

private void bntNormalizar_Click(object sender, EventArgs e)
	{
		int Col = 1;
		for (Col = 1; Col < CargTab.ColumnCount; Col++ )
		{
			int Lin;
			double Valor = 0, Media = 0, Desv = 0;
			DataGridViewRow linha;
			DataGridViewCell celula;
			for (int x = 0; x < 3; x++){// add linhas erro!!!!!
				CargTab.Rows.Add();
			}
			CargTab.Refresh();
			for (Lin = 0; Lin < CargTab.RowCount; Lin++ )
			{
				linha= CargTab.Rows[Lin];	   //i é o número  da linha selecionada
				celula = linha.Cells[Col];				   //j é a posição da coluna selecionada (0 para a primeira e por ai fora)
				Valor += Convert.ToDouble(celula.Value);
			}
			Media = Valor / (Lin - 1);
			Desv = (Valor - Media) * (Valor - Media);
			 //ERRO NAS LINHAS ABAIXO
			CargTab.Rows[Lin + 2].Cells[Col].Value = Media;
			CargTab.Rows[Lin + 2].Cells[Col].Value = Desv;
			CargTab.Refresh();
		}

Edited by Zamparo

Share this post


Link to post
Share on other sites
Zamparo

O Add precisa de um parametro com a linha a adicionar.

Vê aqui exemplos:

http://stackoverflow.com/questions/10063770/c-sharp-how-to-add-a-new-row-to-datagridview-programmatically

No entanto isso não iria adicionar 3 linhas para cada coluna?

Olá nelsonr não tem problema de não add 3 linhas só queria pular uma linha para adicionar os valores.

Fiz da forma abaixo, não sei se está certo sou iniciante em programação desculpe as falhas. segue código novamente com o erro Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound. persistindo.

    private void bntNormalizar_Click(object sender, EventArgs e)
    {
	    int Col = 1;
	    for (Col = 1; Col < CargTab.ColumnCount; Col++ )
	    {
		    int Lin, cel = 0;
		    double Valor = 0, Media = 0, Desv = 0;
		    DataGridViewRow linha;
		    DataGridViewCell celula;
		    /*for (int x = 0; x < 3; x++){
			    CargTab.Rows.Add();
		    }*/
		    CargTab.Refresh();
		    for (Lin = 0; Lin < CargTab.RowCount; Lin++ )
		    {
			    linha= CargTab.Rows[Lin];	   //i é o número  da linha seleccionada
			    celula = linha.Cells[Col];				   //j é a posição da coluna seleccionada (0 para a primeira e por ai fora)
			    Valor += Convert.ToDouble(celula.Value);
		    }
		    Media = Valor / (Lin - 1);
		    Desv = (Valor - Media) * (Valor - Media);
		    //ERRO NAS LINHAS ABAIXO
		    /*CargTab.Rows[Lin + 2].Cells[Col].Value = Media;
		    CargTab.Rows[Lin + 2].Cells[Col].Value = Desv;*/
		    DataGridViewRow row = (DataGridViewRow)CargTab.Rows[0].Clone();
		    row.Cells[cel].Value = Media;
		    cel ++;
		    row.Cells[cel].Value = Desv;
		    cel ++;
		    CargTab.Rows.Add(row);
		    CargTab.Refresh();
	    }
    }

Share this post


Link to post
Share on other sites
nelsonr

Ah espera, a grelha tem os dados ligados directamente a uma origem (databound)?

Assim para adicionares linhas à grelha, teras de adicionar na origem.

Esses dados vêm de onde? base de dados?

Share this post


Link to post
Share on other sites
Zamparo

Ah espera, a grelha tem os dados ligados directamente a uma origem (databound)?

Assim para adicionares linhas à grelha, teras de adicionar na origem.

Esses dados vêm de onde? base de dados?

nelsonr esses vem de uma planilha em Excel segue o código completo para você dar uma olhada:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
namespace Normalização
{
   public partial class FormNorm : Form
   {
    public FormNorm()
    {
	    InitializeComponent();
    }
    private void button3_Click(object sender, EventArgs e)
    {
	    OpenFileDialog ofd = new OpenFileDialog();
	    ofd.Title = "Selecionar Arquivo";
	    ofd.FileName = TxBoxArquivo.Text;
	    ofd.Filter = "Arquivo Excel (.xls.xlxs)|*.xls;*.xlsx|Todos os Arquivos|*.*";
	    ofd.FilterIndex = 1;
	    if(TxBoxAba.Text == ""){
		    MessageBox.Show("Insira a aba da planilha que desseja ler!!!!!");
	    }
	    else if (ofd.ShowDialog() == DialogResult.OK)
	    {
		    TxBoxArquivo.Text = ofd.FileName;
		    Application.DoEvents();   
		    /*string constr = "Provider = MicroSoft.Jet.OLEDB.4.0; Data Source="+ TxBoxArquivo.Text +"; Extended Properties =\"Excel 8.0; HDR=yes;\";";
		    OleDbConnection conn = new OleDbConnection(constr);
		    OleDbDataAdapter sda = new OleDbDataAdapter("SELECT * FROM [sheet0$]", conn);
		    DataTable dt = new DataTable();
		    sda.Fill(dt);
		    CargTab.DataSource = dt;*/
		    //Define Caminho completo para ficheiro em STRING.
			 string path = System.IO.Path.GetFullPath(ofd.FileName);
			 // Define pedido a fazer em forma de STRING.
			 string query = @"SELECT * FROM ["+TxBoxAba.Text+"$]";
		    // Define ligação como nova ligação OleDB.
		    OleDbConnection conn = new OleDbConnection();
		    // Define linha de comunicação com todos os dados recuperados até aqui.
		    conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ofd.FileName + ";Extended Properties= \"Excel 12.0 Xml;HDR=YES;IMEX=1\";";
		    // Define adaptador para pedido "query" (tipo string) ao adaptador que comunica com o ficheiro excel através da ligação CONN definida anteriormente.
		    OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn);
		    DataSet dataSet = new DataSet();
		    adapter.Fill(dataSet);
		    CargTab.DataSource = dataSet.Tables[0];
	    }
	    else{
		    MessageBox.Show("Erro ao encontrar arquivo!!!!!");
	    }
    }
    private void bntNormalizar_Click(object sender, EventArgs e)
    {
	    int Col = 1;
	    for (Col = 1; Col < CargTab.ColumnCount; Col++ )
	    {
		    int Lin, cel = 0;
		    double Valor = 0, Media = 0, Desv = 0;
		    DataGridViewRow linha;
		    DataGridViewCell celula;
		    CargTab.Refresh();
		    for (Lin = 0; Lin < CargTab.RowCount; Lin++ )
		    {
			    linha= CargTab.Rows[Lin];	   //i é o número  da linha seleccionada
			    celula = linha.Cells[Col];				   //j é a posição da coluna seleccionada (0 para a primeira e por ai fora)
			    Valor += Convert.ToDouble(celula.Value);
		    }
		    Media = Valor / (Lin - 1);
		    Desv = (Valor - Media) * (Valor - Media);
		    //ERRO NAS LINHAS ABAIXO
		    /*CargTab.Rows[Lin + 2].Cells[Col].Value = Media;
		    CargTab.Rows[Lin + 2].Cells[Col].Value = Desv;*/
		    DataGridViewRow row = (DataGridViewRow)CargTab.Rows[Lin + 1].Clone();
		    row.Cells[cel].Value = Media;
		    cel ++;
		    row.Cells[cel].Value = Desv;
		    cel ++;
		    CargTab.Rows.Add(row);
		    CargTab.Refresh();
	    }
    }
   }
}

Share this post


Link to post
Share on other sites
Zamparo

Olá resolvi a situação clonando os valores do DataGridView para um Array bi-dimensional e depois de fazer os cálculos copio os valores novamente para o DataGridView.

Obrigado a todos!!!!

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
Sign in to follow this  

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