Salvare tabella con c# in VS2005

martedì 28 ottobre 2008 - 18.27

LUNA Profilo | Junior Member

Salve!!Volevo chiedere se qualcuno mi saprebbe dire come posso salvare(in qualsiasi formato) i dati contenuti in un datagrid, in modo tale che poi ne possa fare un copia e incolla in una pagina word!!
Vi ringrazio tanto!!
Luna

alexmed Profilo | Guru

Ciao
Con questa procedura salvi in formato CSV

Private Sub SaveGridDataInFile(ByRef fName As String)

Dim I As Integer = 0
Dim j As Integer = 0
Dim cellvalue$
Dim rowLine As String = ""

Try
Dim objWriter As New System.IO.StreamWriter(fName, True)
For j = 0 To (DataGridView1.Rows.Count - 2)
For I = 0 To (DataGridView1.Columns.Count - 1)
If Not TypeOf DataGridView1.CurrentRow.Cells.Item(I).Value Is DBNull Then
cellvalue = DataGridView1.Item(I, j).Value
Else
cellvalue = ""
End If
rowLine = rowLine + cellvalue + ","
Next
objWriter.WriteLine(rowLine)
rowLine = ""
Next
objWriter.Close()
MsgBox("Text written to file")
Catch e As Exception
MessageBox.Show("Error occured while writing to the file." + e.ToString())
Finally
FileClose(1)
End Try

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
SaveGridDataInFile(Me.TextBox1.Text) Qui ci metti il percorso ed il nome del file *.CSV
End Sub

Ciao

alexmed Profilo | Guru

Scusa ...
che tradotto in C# dovrebbe essere

private void SaveGridDataInFile(ref string fName) {
int I = 0;
int j = 0;
object cellvalue;
string rowLine = "";
try {
System.IO.StreamWriter objWriter = new System.IO.StreamWriter(fName, true);
for (j = 0; (j
<= (DataGridView1.Rows.Count - 2)); j++) {
for (I = 0; (I
<= (DataGridView1.Columns.Count - 1)); I++) {
if (!(DataGridView1.CurrentRow.Cells.Item[I].Value.GetType() == DBNull)) {
cellvalue = DataGridView1.Item[I, j].Value;
}
else {
cellvalue = "";
}
rowLine = (rowLine
+ (cellvalue + ","));
}
objWriter.WriteLine(rowLine);
rowLine = "";
}
objWriter.Close();
MsgBox("Text written to file");
}
catch (Exception e) {
MessageBox.Show(("Error occured while writing to the file." + e.ToString()));
}
finally {
FileClose(1);
}
}

private void Button2_Click(object sender, System.EventArgs e) {
SaveGridDataInFile(this.TextBox1.Text);
// Qui ci metti il percorso ed il nome del file *.CSV
}

come da http://www.carlosag.net/Tools/CodeTranslator/

Ciao

LUNA Profilo | Junior Member

Ciao AlexMed!Grazie per la risposta e per la conversione in c#!
Non sono però ancora riuscita a salvare la singola tabella di un dataGrid in un file tipo .xls.
Sto cercando di utilizzare SaveFileDialog,mi puoi dare qualche consiglio?
Grazie mille!

alexmed Profilo | Guru

Ciao
Se vuoi implementare il codice sopra con un SaveFileDialog1 (sempre tramite CodeTranslator):

SaveFileDialog1.InitialDirectory = "C:\\";
SaveFileDialog1.Filter = "CSV files (*.csv)|*.CSV";
SaveFileDialog1.FilterIndex = 2;
SaveFileDialog1.FileName = "";
SaveFileDialog1.RestoreDirectory = true;
if ((SaveFileDialog1.ShowDialog() == DialogResult.OK)) {
SaveGridDataInFile(SaveFileDialog1.FileName);
}


Però mi viene un dubbio:
Tu voui salvare il contenuto della DataGrid in un file Excel oppure vuoi inserire il valore di una cella del DataGrrid in una cella specifica del foglio Excel?
Nel primo caso allora il concetto che ti ho esposto sopra dovrebbe andar bene (tra l'altro: è un DataGrid o un DataGridView?).
Il file CSV una volta creato lo puoi tranquillamente aprire con Excel.
Nel secondo caso le cose cambiano decisamente e quindi affronterei il discorso solo se siamo in questo caso, anche perchè non sò se in c# e in vb i concetti sono gli stessi.

Ciao

LUNA Profilo | Junior Member

Esatto, mi interessa salvare il contenuto di una DataGrid in un file excell, si sto lavorando con DataGridView.
Il problema è che mi da alcuni errori che non capisco:
1)'System.Windows.Forms.DataGridViewRow' does not contain a definition for 'Item'
2)The name 'FileClose' does not exist in the current context
3)'System.Windows.Forms.DataGridView' does not contain a definition for 'Item'
4)The best overloaded method match for 'mapPoint.Form1.SaveGridDataInFile(ref string)' has some invalid arguments

aiutooooo

Ti riporto anche per intero ciò che ho scritto!
private void button12_Click(object sender, EventArgs e)
{

SaveFileDialog DialogSave = new SaveFileDialog();
DialogSave.DefaultExt = "csv";

DialogSave.Filter = "CSV files (*.csv)|*.CSV";

DialogSave.AddExtension = true;

DialogSave.RestoreDirectory = true;

DialogSave.Title = "Where do you want to save the file?";

DialogSave.InitialDirectory = @"C:\Documents and Settings\annakarenina\Desktop";

DialogSave.FileName = "io";

if (DialogSave.ShowDialog() == DialogResult.OK)
{
SaveGridDataInFile(DialogSave.FileName);
}
else
{
MessageBox.Show("You hit cancel or closed the dialog.");
}

DialogSave.Dispose();
DialogSave = null;

}

private void SaveGridDataInFile(ref string fName)
{
{
int I = 0;
int j = 0;
object cellvalue;
string rowLine = "";
try
{
StreamWriter objWriter = new StreamWriter(fName, true);
for (j = 0; (j
<= (DataDistance.Rows.Count - 2)); j++)
{
for (I = 0; (I
<= (DataDistance.Columns.Count - 1)); I++)
{
if (!(DataDistance.CurrentRow.Item[I].Value.GetType() == System.DBNull.Value))
{
cellvalue = DataDistance.Item[I, j].Value;
}
else
{
cellvalue = "";
}
rowLine = (rowLine
+ (cellvalue + ","));
}
objWriter.WriteLine(rowLine);
rowLine = "";
}
objWriter.Close();
MessageBox.Show("Text written to file");
}
catch (Exception e)
{
MessageBox.Show(("Error occured while writing to the file." + e.ToString()));
}
finally
{
FileClose(1);
}


throw new Exception("The method or operation is not implemented.");
}



}

}

alexmed Profilo | Guru

Ciao

Forse il motivo è da ricercare in "fName"

Prova modificando così:


private void button12_Click(object sender, EventArgs e)
{

SaveFileDialog DialogSave = new SaveFileDialog();
DialogSave.DefaultExt = "csv";

DialogSave.Filter = "CSV files (*.csv)|*.CSV";

DialogSave.AddExtension = true;

DialogSave.RestoreDirectory = true;

DialogSave.Title = "Where do you want to save the file?";

DialogSave.InitialDirectory = @"C:\Documents and Settings\annakarenina\Desktop";

DialogSave.FileName = "io";

if (DialogSave.ShowDialog() == DialogResult.OK)
{
SaveGridDataInFile(DialogSave.FileName);
}
else
{
MessageBox.Show("You hit cancel or closed the dialog.");
}

DialogSave.Dispose();
DialogSave = null

Scusa mi è partito "Invia Messaggio"
Dove hai
SaveGridDataInFile(DialogSave.FileName);
mettigli
fName = DialogSave.FileName

LUNA Profilo | Junior Member

Perfeto grazie!quel problema è risolto, però continua a non riconoscermi "item" e "FileClose(1)"....
Non so come muovermi...

alexmed Profilo | Guru

Facciamo così, andiamo per gradi

Questo codice dovrebbe farti vedere in un MsgBox riga per riga con i campi separati da ";"

for (int iRow = 0; (iRow
<= (this.dgvCARRELLO.RowCount - 1)); iRow++) {
string rowString = "";
for (int iCol = 0; (iCol
<= (this.dgvCARRELLO.ColumnCount - 1)); iCol++) {
rowString = (rowString
+ (this.dgvCARRELLO.Item(iCol, iRow).Value.ToString + ";"));
}
MsgBox(rowString);
}

Se funziona questo andiamo avanti

LUNA Profilo | Junior Member

Scusami se ti sto prendendo così tanto tempo!Ho un po modificato il codice perchè alcune parole non me le leggeva(come item)
private void SaveGridDataInFile(string fName)
{
int N = DataDistance.RowCount;
int M = DataDistance.ColumnCount;
int I = 0;
int j = 0;
object cellvalue;
string rowLine = "";
try
{
StreamWriter objWriter = new StreamWriter(fName, true);
while(I<N)
{
while(j<M)
{
if (DataDistance.Rows[I].Cells[j].Value != System.DBNull.Value)
{
cellvalue = DataDistance.Rows[I].Cells[j].Value;
MessageBox.Show(DataDistance.Rows[I].Cells[j].Value.ToString());
}
else
{
cellvalue = "";
}
rowLine =rowLine+ Convert.ToString(cellvalue);
// rowLine = (rowLine + (cellvalue + ","));
j++;
}
MessageBox.Show(rowLine.ToString());
objWriter.WriteLine(rowLine);
rowLine = "";
I++;
}
objWriter.Close();
...
Scrivendo così però mi ricopia tutti i valori della dataGrid sulla prima cella e basta!Io vorrei che ogni valore stia al suo posto, cioè nella sua cella...Se hai ancora un po di tempo da dedicarmi, ti sarei molto grato se mi aiutassi!!

alexmed Profilo | Guru

Ciao
stavo guardando la guida in linea ed ho trovato questo sotto la proprietà "Item"

public DataGridViewCell this [
int columnIndex,
int rowIndex
] { get; set; }

Mi chiedevo se non basta sostituire "Item" con "Cell"?

Purtroppo non conosco la sintassi di C# ma credo che i concetti siano gli stessi e che il Code Translation risolvesse al 100% la conversione.
A questo punto ti chiedo:
In C# se devi leggere il contenuto della cella posizionata nella 2a colonna e seconda linea cosa scriveresti?

LUNA Profilo | Junior Member

Per leggere il contenuto di una cella posizionata nella seconda colonna e nella seconda riga scriverei:
DataGrid.Rows[2].Cells[2].Value qui è contenuto il valore della cella posizionata nella seconda riga della seconda colonna!
Comunque penso che la conversione che ho fatto senza usare item vada bene e penso anche di aver risolto il problema!Ti ringrazio molto per l'aiuto e per il codice che mi hai mandato!Sei stato gentilissimo!!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5