代码之家  ›  专栏  ›  技术社区  ›  Nano Taboada

使用Linq向SQL提交DataGridView更改时出现问题

  •  0
  • Nano Taboada  · 技术社区  · 16 年前

    DataGridView 但老实说,我很难做到这一点。我基本上使用的是LINQ to SQL类和事件,以下是最重要的片段:

    var data =  from q in data.FOOBARS
                select new
                {
                    ID = q.FOOBAR_ID,
                    LOREM = q.FOOBAR_LOREM,
                    IPSUM = q.FOOBAR_IPSUM
                };
    
    DataGridView grid = new DataGridView();
    grid.DataSource = data;
    
    // grid EVENTS     
    private void grid_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
        this.grid.CurrentCell.ReadOnly = false;
        this.grid.BeginEdit(true);
    }
    
    private void grid_CellLeave(object sender, DataGridViewCellEventArgs e)
    {
        if (this.grid.CurrentCell.IsInEditMode)
        {   
            // METHOD CALL            
            this.SetVariableValue(this.grid.CurrentRow.Cells["ID"].Value.ToString(), this.grid.CurrentCell.OwningColumn.Name, this.grid.CurrentCell.FormattedValue.ToString(), this.grid.CurrentCell.EditedFormattedValue.ToString());
        }
    
        this.grid.CommitEdit(DataGridViewDataErrorContexts.Commit);
        this.grid.EndEdit();
    }
    
    // METHOD IMPL
    private void SetVariableValue(string id, string type, string current, string edited)
    {
        try
        {
            if (current != edited)
            {
                using (FOOBARDataClassesDataContext data = new FOOBARDataClassesDataContext(this.BuildConnection()))
                {
                    data.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
    
                    switch (type)
                    {
                        case "LOREM":
                            var currentLorem = data.FOOBARS.SingleOrDefault(v => v.FOOBAR_ID == Convert.ToInt32(id)).FOOBAR_LOREM;
                            currentLorem = edited;
                            data.SubmitChanges(ConflictMode.ContinueOnConflict);
                            break;
    
                        case "IPSUM":
                            var currentIpsum = data.FOOBARS.SingleOrDefault(v => v.FOOBAR_ID == Convert.ToInt32(id)).FOOBAR_IPSUM;
                            currentIpsum = edited;
                            data.SubmitChanges(ConflictMode.ContinueOnConflict);
                            break;
    
                        default:
                            break;
                    }
                    data.Refresh(RefreshMode.OverwriteCurrentValues);
                }
            }
        }
        catch (Exception error)
        {
            if (logger.IsErrorEnabled) logger.Error(error.Message);
        }
    }
    

    调试看起来不错,对象实际上正在更新,但由于某些原因,更改既没有提交也没有更新。

    任何帮助都将不胜感激。提前谢谢你们!

    1 回复  |  直到 16 年前
        1
  •  0
  •   Nano Taboada    16 年前

    出于某种原因,这是真的 不起作用

    var currentLorem = data.FOOBARS.SingleOrDefault(v => v.FOOBAR_ID == Convert.ToInt32(id)).FOOBAR_LOREM;
    currentLorem = edited;
    data.SubmitChanges(ConflictMode.ContinueOnConflict);
    

    但是这个 (请注意第1行和第2行FOOBAR\u LOREM属性中的更改):

    var currentLorem = data.FOOBARS.SingleOrDefault(v => v.FOOBAR_ID == Convert.ToInt32(id));
    currentLorem.FOOBAR_LOREM = edited;
    data.SubmitChanges(ConflictMode.ContinueOnConflict);