Zamparo Posted September 17, 2013 at 01:15 AM Report #524826 Posted September 17, 2013 at 01:15 AM 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
nelsonr Posted September 17, 2013 at 08:32 AM Report #524833 Posted September 17, 2013 at 08:32 AM 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?
Zamparo Posted September 19, 2013 at 10:52 AM Author Report #525138 Posted September 19, 2013 at 10:52 AM (edited) 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 September 19, 2013 at 10:56 AM by Zamparo
nelsonr Posted September 19, 2013 at 10:58 AM Report #525139 Posted September 19, 2013 at 10:58 AM 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?
Zamparo Posted September 19, 2013 at 11:25 AM Author Report #525141 Posted September 19, 2013 at 11:25 AM 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(); } }
nelsonr Posted September 19, 2013 at 11:34 AM Report #525142 Posted September 19, 2013 at 11:34 AM 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?
Zamparo Posted September 19, 2013 at 11:41 AM Author Report #525145 Posted September 19, 2013 at 11:41 AM 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(); } } } }
brunobola Posted September 24, 2013 at 11:57 PM Report #525818 Posted September 24, 2013 at 11:57 PM Tipicamente não podes fazer essa operação, ou trabalhas com o Datasource se estiver bounded ou então trabalhas directamente na grid, vê o post a seguir. http://stackoverflow.com/questions/11445121/rows-cannot-be-programmatically-added-to-the-datagridviews-rows-collection-when
Zamparo Posted September 25, 2013 at 12:23 PM Author Report #525898 Posted September 25, 2013 at 12:23 PM 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!!!!
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