Я сталкивался с этим и делал нечто подобное тому, что делал OP [bretddog], но я написал более полный метод.
Я делюсь своей работой здесь:
public class YourDataItem
{
// put all of your data here. This is just stubbed here as an example
public int Id { get; set; }
public String Description { get; set; }
}
private void DeleteBtn_Down(Object sender, MouseEventArgs e)
{
var item = (YourDataItem)bindingSource1.Current;
var dr = DialogResult.None;
if (0 < item.Id)
{
var ask = String.Format("Delete Item [{0}]?", item.Description);
dr = MessageBox.Show(ask, "Confirm Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
}
if (dr == DialogResult.Yes)
{
try
{
bindingSource1.EndEdit();
_datamodel.YourDataItems.DeleteOnSubmit(item);
_datamodel.SubmitChanges();
_datamodel.ClearCache();
bindingSource1.SetPosition<YourDataItem>(x => x.Id == 0);
} catch (Exception err)
{
MessageBox.Show("Database changes failed to complete.", String.Format("Delete {0}", err.GetType()), MessageBoxButtons.OK, MessageBoxIcon.Information);
}
} else
{
bindingSource1.CancelEdit();
}
}
Истекло время ожидания источника данных Linq.
Если кто-то нажимает кнопку удаления, когда идет домой на следующий день, приходит на следующий день и нажимает «ОК» в диалоговом окне подтверждения, try...catch
будет обрабатывать исключение удаления объекта.
ClearCache()
- это просто известное расширение DataContext:
/// <summary>
/// Clears the cache from a DataContext to insure data is refreshed
/// </summary>
/// <param name="dc"></param>
public static void ClearCache(this DataContext dc)
{
dc.GetType().InvokeMember("ClearCache", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, dc, null);
}