2016-06-20 21 views
0

Ich habe ein Formular WinForms Formularfenster mit einem DataGridView. Es ruft Daten aus einer SQL Server Express-Datenbank mit Linq ab und zeigt sie in den DataGridView-Spalten ordnungsgemäß an. Ich habe es in den Eigenschaften festgelegt, um die Bearbeitung zu ermöglichen. Wenn ich ein Feld zur Laufzeit editiere und ändere, wird nur die Datenbank aktualisiert, wenn ich einen Spaltennamen festlege. Dies funktioniert nicht gut, weil ich es brauche, um die Spalte, die ich bearbeite, zu aktualisieren, nicht die eine, die fest codiert ist. Es muss dynamisch sein. Siehe die Kommentare neben der Website. ??? Ich kann einen Spaltennamen manuell von der Site wählen. Was auch immer das ist, was ich nicht will. Ich möchte Site.columnname aus der von mir festgelegten Zeichenfolge ausführen können.C# Visual Studio: Wie aktualisiere ich eine DB von Bearbeiten mit DataGridView mit LINQ?

Ich sehe andere Beispiele Laden und/oder Bearbeiten eines DataGridView mit Daten, aber diese Beispiele verwenden nicht LINQ.

Meine Form Last Code:

public partial class EditImage : Form 
    { 
     SQL sqlLink = new SQL(); 
     CustomMessageBox msg = new CustomMessageBox(); 

    public EditImage() 
    { 
     InitializeComponent(); 
    } 

    private void EditImage_Load(object sender, EventArgs e) 
    { 
     dgImageView.DataSource = sqlLink.getImageList(); 
     dgImageView.AutoResizeColumns(); 
     dgImageView.AutoResizeRows(); 
    } 

    private void dgImageView_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 
     int rid = e.RowIndex; 
     int dbrid = rid + 1; 
     int cid = e.ColumnIndex; 
     string change = dgImageView[cid, rid].Value.ToString(); 
     string columname = dgImageView[cid, rid].OwningColumn.Name; 

     using (var dc = new DbLink()) 
     { 
      var site = (from img in dc.images where img.id == dbrid select img).SingleOrDefault(); 

      if (site != null) 
      { 
       try 
       { 
        site.??? = change; 
        dc.SubmitChanges(); 
        dgImageView.EndEdit(); 
       } 
       catch (Exception ex) 
       { 
        msg.Text("Error", ex.ToString(), MessageBoxButtons.OK); 
       } 
      } 
     } 
    } 

-Code von SQL-Klasse abzurufen Datasource:

public IQueryable getImageList() 
    { 
     return selectImageList(); 
    } 

und

private IQueryable selectImageList() 
    { 
     DbLink dbl = new DbLink(); 
     image tl = new image(); 

     var results = from imgs in dbl.images 
         select imgs; 

     return results; 
    } 

Ein Screenshot der dbml Datei:

enter image description here

Antwort

1

Sie mit Reflexion versuchen könnte:

var changedColumn = typeof(image).GetProperty(columnName); 
changedColumn.SetValue(site,change);