Laden...

SelectedRows einer DatenGridView mit bindingsource kopieren...

Erstellt von tweaker vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.399 Views
T
tweaker Themenstarter:in
12 Beiträge seit 2010
vor 12 Jahren
SelectedRows einer DatenGridView mit bindingsource kopieren...

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

6.911 Beiträge seit 2009
vor 12 Jahren

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!"

T
tweaker Themenstarter:in
12 Beiträge seit 2010
vor 12 Jahren

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 !!??
            }
R
158 Beiträge seit 2007
vor 12 Jahren

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 -&gt; eine neue Tebellenzeile ist an nix gebunden 😉  

Rainer

[EDIT] Code wg. Fehler korrigiert [/EDIT]