verwendetes Datenbanksystem: mysql + odbc-connector
Hab ein Problem mit dem kopieren von Datensätzen...
Ich möchte selectierte DAtensätze in der Datenbank kopieren.
Versuche das wie folgt. klappt aber nciht..
Was mache ich falsch?
private void tsBCopy_Click(object sender, EventArgs e)
{
DataGridViewRow[] selectedRows = new DataGridViewRow[dataGridView1.SelectedRows.Count];
long maxDataset = (long)dataTable2TableAdapter.GetMaxDataset();
for (int i = 0; i < dataGridView1.SelectedRows.Count; i++)
{
selectedRows[i] = (DataGridViewRow)(dataGridView1.SelectedRows[i].DataBoundItem as DataGridViewRow);
selectedRows[i].Cells[0].Value = ++maxDataset;
dataSet1.DataTable2.Rows.Add((DataRow)selectedRows[i].DataBoundItem);
}
}
bin Newbie in der materie
Hallo tweaker,
ich kenn mich bei DataSets nicht aus, aber es schaut ganz danach aus als ob du Wert- und Referenztypen verwechselst bzw. das DataSet erkennt dass es dieselbe Instanz noch einmal ist. D.h. du musst dafür eine "tiefe Kopie" erstellen. Suche mal danach, suche auch nach "Clone".
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Kann schon sein, das ich da einiges Verwechsle....
Ich möchte einfach folgendes machen:
die ausgewählten Zeilen kopieren und dabei Werte in bestimmten Zellen ändern.
Das erste problem was auftaucht, ist, das ich die selectieren Zeilen nur in DataGridViewSelectedRows-Typen bekomm und die nicht einfach in eine DataRow umwandeln kann, damit ich die neuen Rows dann in die DataTable einfügen kann.
Wie lös ich das Problem?
Für Erklärungen der Hintergründe wäre ich natürlich auch dankbar...
Momentan mach ich das so:
int copyCount = Convert.ToInt32(tbCopyCount.Text);
int maxDataset = (int)getMaxDataset();
DataGridViewRow[] newRows = new DataGridViewRow[copyCount * dataGridView1.SelectedRows.Count];
for (int i = 0; i < dataGridView1.SelectedRows.Count; i++ )
{
newRows[i] = (DataGridViewRow)dataGridView1.SelectedRows[i].Clone();
newRows[i].Cells[0].Value = ++maxDataset;
dTable.Rows.Add(newRows[i].DataBoundItem as DataRow); // Exception: DataBoundItem = NULL !!??
}
mehrere Möglichkeiten, um zum gewünschten Ergebnis zu kommen:
a.) DGV ist an eine Datenquelle gebunden:
if (personDataGridView.SelectedRows != null && personDataGridView.SelectedCells.Count > 1)
{
foreach (DataGridViewRow dgvr in personDataGridView.SelectedRows)
{
DataRowView drv = (DataRowView)dgvr.DataBoundItem;
if (drv != null)
{
object[] dgvrItems = drv.Row.ItemArray;
//--evtl. Änderungen vor Übernahme in neue Tabelle
dgvrItems[0] = Convert.ToInt16(dgvrItems[0]) * 100;
dgvrItems[1] = (string)"irgendwas";
//--Erstellen einer neuen Tabellenzeile und Einfügen derselben
dtKopie.Rows.Add(dgvrItems);
}
}
}
b.) DGV hat keine Datenquelle:
if (personDataGridView.SelectedRows != null && personDataGridView.SelectedCells.Count > 1)
{
foreach (DataGridViewRow dgvr in personDataGridView.SelectedRows)
{
if (dgvr != null)
{
DataGridViewCellCollection dgvrItems = dgvr.Cells;
//--Erstellen einer neuen Tabellenzeile und
//--Werten der Zellen füttern
DataRow newrow = dtKopie.NewRow();
for (int i = 0; i < dgvrItems.Count; i++)
{
newrow[i] = dgvrItems[i].Value;
}
//--evtl. Änderungen vor Übernahme in neue Tabelle
newrow[0] = Convert.ToInt16(dgvrItems[0].Value) * 100;
newrow[1] = (string)"irgendwas";
//--neue und geänderte Zeile der Tabelle hinzufügen
dtKopie.Rows.Add(newrow);
}
}
}
:rtfm:DataBound :rtfm: DataRowView
Code entsprechend Deinen Bedürfnissen anpassen (Tabellenbezeichnung etc);
Codeschnippsel aus einem meiner Projekte und dient nur zur Veranschaulichung 😉
dTable.Rows.Add(newRows_.DataBoundItem as DataRow); // Exception: DataBoundItem = NULL !!?? Dürfte klar sein -> eine neue Tebellenzeile ist an nix gebunden 😉
Rainer
[EDIT] Code wg. Fehler korrigiert [/EDIT]