Frank Dzaebel, erstellt am: 17.6.2010, zuletzt geändert:
18.6.2010
Kategorie: C# Sprache, .NET-Version: 2-4, [Download]
[Download
über Views]
Das Verschieben von Elementen über DataGridViews kann man
mit Hilfe des BindingSource und dessen Methoden leicht bewerkstelligen. Im Folgenden
ein kleines Beispiel über ein Copy()-Vorgang eines DataTables, das auch das Layout über einen TableLayoutPanel deutlich macht. Weiter unten dann noch eine
Beispiel-Implementation über zwei Views.
Dazu ggf. auch interessant: [DataGridView Drag Drop]

DataSetPerson ds = new DataSetPerson();
BindingSource bs1 = new BindingSource();
BindingSource bs2 = new BindingSource();
private void Form1_Load(object sender, EventArgs e)
{
ds.ReadXml("personen.xml");
bs1.DataSource = ds.Person.Copy();
bs2.DataSource = ds.Person;
dgv1.DataSource = bs1;
var idCol1 = dgv1.Columns[ds.Person.IDColumn.ColumnName];
idCol1.Visible = false;
dgv2.DataSource = bs2;
var idCol2=dgv2.Columns[ds.Person.IDColumn.ColumnName];
idCol2.Visible = false;
for (int i = 0; i < bs1.Count; i++) bs2.RemoveAt(0);
EnableDisableButons();
}
private void btnRechts_Click(object sender, EventArgs e)
{
Verschieben(bs1,bs2);
}
private void btnLinks_Click(object sender, EventArgs e)
{
Verschieben(bs2, bs1);
}
private void Verschieben(BindingSource b1, BindingSource b2)
{
DataRowView drv1 = b1.Current as DataRowView;
b2.AddNew();
DataRowView drv2 = b2.Current as DataRowView;
drv2.Row.ItemArray = drv1.Row.ItemArray;
b1.RemoveCurrent(); EnableDisableButons();
}
void EnableDisableButons()
{
btnRechts.Enabled = (bs1.Count > 0);
btnLinks.Enabled = (bs2.Count > 0);
}
Implementation über zwei Views
DataSetPerson ds = new DataSetPerson();
BindingSource bs1 = new BindingSource();
BindingSource bs2 = new BindingSource();
private void Form1_Load(object sender, EventArgs e)
{
ds.ReadXml("personen.xml");
ds.Person.Columns.Add("Enthalten", typeof(bool));
for (int i = 0; i < ds.Person.Rows.Count; i++)
ds.Person[i]["Enthalten"] = (i % 2 == 0);
bs1.DataSource = new DataView(ds.Person);
bs2.DataSource = new DataView(ds.Person);
bs1.Filter = "Enthalten=false";
bs2.Filter = "Enthalten=True";
dgv1.DataSource = bs1;
dgv1.Columns[ds.Person.IDColumn.ColumnName].Visible = false;
dgv1.Columns["Enthalten"].Visible = false;
dgv2.DataSource = bs2;
dgv2.Columns[ds.Person.IDColumn.ColumnName].Visible = false;
dgv1.Columns["Enthalten"].Visible = false;
EnableDisableButons();
}
private void btnRechts_Click(object sender, EventArgs e)
{
Verschieben(true, bs1, dgv1);
}
private void btnLinks_Click(object sender, EventArgs e)
{
Verschieben(false, bs2, dgv2);
}
private void Verschieben(bool enthalten, BindingSource bs, DataGridView dgv)
{
foreach (DataGridViewRow row in dgv.SelectedRows)
{
int pos = bs.Find("ID", row.Cells["ID"].Value);
(bs[pos] as DataRowView).Row["Enthalten"] = enthalten;
}
EnableDisableButons();
}
void EnableDisableButons()
{
btnRechts.Enabled = (bs1.Count > 0);
btnLinks.Enabled = (bs2.Count > 0);
}