Verschieben von Elementen in DataGridViews  
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);
}