Удалить элемент списка с помощью BindingNavigator, а не правильный элемент - PullRequest
2 голосов
/ 25 января 2011

Я использую BindingNavigator для удаления элементов из списка продуктов через просмотр данных. (Метод вызывается main.DeleteProduct () вызывает хранилище для удаления из базы данных).

Мне нужна помощь для улучшения кода события ..DeleteItem_Click. Когда я щелкаю ячейку или строку и затем удаляю кнопку (BindingNavigator), эта строка никогда не удаляется. Он удаляет строку ниже или, если это последняя строка, строку выше, и, если только одна строка, будет приведен нулевой результат. Не должен ли bindingSource.Current быть тем же элементом, что и currentrow of datagridview?

Кроме того, хорошо ли мне использовать способ кастования текущего предмета с использованием источника связывания? Оценил бы лучшее предложение кода, если у вас есть.

Ура!

 public partial class Form1 : Form
{      
    private MainBL main = new MainBL(); 
    private   List<Product> products = new List<Product>

    private void Form1_Load(object sender, EventArgs e)
    {

        bsProducts.DataSource = products;         // BindingSource
        bnProducts.BindingSource = bsProducts;    // BindingNavigator
        dataGridView1.DataSource = bsProducts;    //
    }

    private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
    {

        Product product = (Product)bsProducts.Current;

       // Putting a breakpoint here, shows the identity property is not the same
       // as row selected in datagridview. 

        main.DeleteProduct(product);

    }

Ответы [ 3 ]

3 голосов
/ 19 октября 2012

Лучшим решением, вероятно, является перехват / удаление события удаления Binding Navigator и обработка удаления вручную.

Перейти к Binding Navigator;Откройте свойства в окне «Свойства».Найдите свойство DeleteItem (в категории «Предметы») и установите для него «(нет)».

Теперь вы можете кодировать функцию удаления в событии нажатия кнопки удаления на соответствующей панели инструментов.Код в предыдущем ответе будет работать - теперь вы можете получить правильный «текущий» элемент.При необходимости вы также можете добавить проверку подтверждения («Вы уверены?») Здесь.

Конечно, не забудьте удалить элемент из коллекции, к которой привязан BindingSource (или просто обновитьданные).

2 голосов
/ 25 января 2011

Теперь я понял, что строка удаляется до того, как сработает событие CellClick. Поэтому я заставляю его работать как положено, вместо этого помещая код в событие _MouseDown кнопки удаления. Не уверен, что это самое правильное решение, хотя ..

    private void btnDeleteProducts_MouseDown(object sender, MouseEventArgs e)
    {
        Product product = (Product)bsProducts.Current;
        if (product != null)
        {
           main.DeleteProduct(product);
        }                 
    }
0 голосов
/ 04 ноября 2016

Я сталкивался с этим и делал нечто подобное тому, что делал 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);
}
...