powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как правильно использовать BindingNavigator
11 сообщений из 11, страница 1 из 1
Как правильно использовать BindingNavigator
    #36401123
vinvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) При удалении строки хотел бы задавать вопрос пользователю, а потом уже удалять строку. Как это сделать?

2) При добавлении строки - вызываю форму для редактирования. Если пользователь не захотел сохранять новую строку что дель с вновь добавленным элементом - неужели удалять?
...
Рейтинг: 0 / 0
Как правильно использовать BindingNavigator
    #36401168
vinvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да и еще вопрос на эту же тему.

Если я редактирую данные, а затем отменяю изменения, то как вернуться к первоисточникам?
Приведенный ниже код не работает.

Код: plaintext
1.
2.
3.
if (fd.ShowDialog() != DialogResult.OK)
            {
                usersBindingSource.CancelEdit();
            }

Простите за вопросы. Может быть они уже для кого-то не сложные. Но я пока перебираюсь с Delphi на C# и над такими проблемами иногда сидишь и думаешь - то ли писать кучу кода, о ли есть уже встроенный механизм, а ты о нем просто не знаешь.
...
Рейтинг: 0 / 0
Как правильно использовать BindingNavigator
    #36401212
vinvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да еще важный факт

Данные я в источник получаю через DataContextProvider, а именно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
          private skladEntities1 se;
          .........

            se = new skladEntities1(new Uri("http://localhost:2219/skladDataService.svc/"));

            usersBindingSource.DataSource = typeof(Users);
            foreach (Users us in (from ss in se.Users
                                  select ss))
            {
                usersBindingSource.Add(us);
            }
...
Рейтинг: 0 / 0
Как правильно использовать BindingNavigator
    #36403161
vinvin,

Атключи кнопка по дефольту, пиши обработчик.
...
Рейтинг: 0 / 0
Как правильно использовать BindingNavigator
    #36405651
vinvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело оказалось не таким простым.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
private EventHandler delegateDelete;
...

private void Form1_Load(object sender, EventArgs e)
        {
...
            SetNewClickForDelete();            
        }
...
void bindingNavigatorDeleteItemMyClick(object sender, EventArgs e)
        {
            if (MessageBox.Show("Вы уверены, что хотите удалить?", "", MessageBoxButtons.YesNo  , MessageBoxIcon.Question) == DialogResult.Yes)
            {
                if (delegateDelete != null)
                       delegateDelete(sender, e);
            }
        }
...
private void SetNewClickForDelete()
        {
            object sender = bindingNavigatorDeleteItem;

            FieldInfo fieldEventClick = typeof(ToolStripItem).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);
            object fieldEventClickValue = fieldEventClick.GetValue(sender);
            EventHandlerList handlerList = (EventHandlerList)sender.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(sender, new object[] { });
            Delegate delegates = handlerList[fieldEventClickValue];
           
            if (delegates != null)
            {
                foreach (Delegate targetDelegate in delegates.GetInvocationList())
                {
                    delegateDelete += (EventHandler) targetDelegate;
                    handlerList.RemoveHandler(fieldEventClickValue, targetDelegate);
                }
            }

            bindingNavigatorDeleteItem.Click += new EventHandler(bindingNavigatorDeleteItemMyClick);
}

В этом коде плохо одно - обращение к internal static readonly object EventClick
Хотелось бы услышать коментарии.
...
Рейтинг: 0 / 0
Как правильно использовать BindingNavigator
    #36406720
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void bindingNavigatorDeleteItemMyClick(object sender, EventArgs e)
        {
            if (MessageBox.Show("Вы уверены, что хотите удалить?", "", MessageBoxButtons.YesNo  , MessageBoxIcon.Question) == DialogResult.Yes)
            {
                  // КОД ДЛЯ УДАЛЕНИЯ
                  // Удалить запись с ID такимто
                  // Типа команды Delete * from myTable where tableId = @ID
            }
        }
}

@ID - это идентификатор текущей удаляемой записи.

Не нужно никаких делегатов.
Или я чего-то не понял?
...
Рейтинг: 0 / 0
Как правильно использовать BindingNavigator
    #36406726
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор2) При добавлении строки - вызываю форму для редактирования. Если пользователь не захотел сохранять новую строку что дель с вновь добавленным элементом - неужели удалять?

Оптимальный вариант:
1. Вызываете форму Добавления нового элемента
2. Нажимаете кнопку сохранить
3. Запись сохраняется в БД
4. Закрываете форму.
При нажатии кнопки отмены ничего не происходит, просто закрываем форму.

У вас видимо сделано так:
1. Добавляете новую запись в БД
2. Открываете форму для редактирования
3.1. Нажимаете кнопку сохранить [Запись апдейтица]
3.2. Нажимаете кнопку отмена [Запись удаляется из БД]
4. Закрываете форму
...
Рейтинг: 0 / 0
Как правильно использовать BindingNavigator
    #36408503
vinvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том, что я работаю с сервисами данных и с EF.

Грид и BindingNavigator привязаны к источнику данных - BindingSource, у которого DataSource типа ObjectQuery. При загрузке формы я создаю контекст данных и присваюваю

Код: plaintext
BindingSource.DataSource = контекст.Users

При нажатии на кнопку (+) в навигаторе происходит два события - добавление записи в источник данных (встроенное действие) и мое действие - вызов формы.

Во время вызова формы элементы формы привязываются к элементам управления через переданный в конструкторе BindingSource.Current как показано ниже:

Код: plaintext
imTextBox.DataBindings.Add("Text", MyObjectUser, "Im", true);

Однако, при отказе от сохранения приходиться явно удалять:

Код: plaintext
usersBindingSource.RemoveCurrent(); 

Таким образом я выигрываю в следующем:
1. Имею общий код для использования - т.е. могу сделать общий класс для использования добавления.
2. Использую класс BindingNavigator (ничего в нем не дописывая)

Не нужно никаких делегатов.
Или я чего-то не понял?

При удалении я так же использую готовый класс - BindingNavigator. Т.е. создаю универсальный класс для работы с данными.

Таким образом я здесь пытаюсь не просто сделать какое-то действие, а сделать его универсальным.
...
Рейтинг: 0 / 0
Как правильно использовать BindingNavigator
    #36408928
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А теперь стало ясно.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
{
  if (MessageBox.Show("Вы уверены, что хотите удалить?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
  {
     myBindingSource.RemoveCurrent();
  }
}
т.е. вы не хотите каждый раз вставлять название myBindingSource для каждой кнопки удаления, а хотите использовать универсальный метод.

Право конечно ваше, но получите кучу проблем о которых вы уже знаете (поддержка в новых фремворках и др.)

Вобщем тут как раз и не нужно никакой универсальности, разве сложно указать 1 переменную (myBindingSource)?

При редактировании записи опять же, лучше использовать метод, в который параметром передаем текущую запись, которую мы явно прописываем. Или сразу туда передаем this.myBindingSource далее используем по своему усмотрению, отображаем на форме и все такое.
Универсальность можно достичь за счет того что поля на форме редактирования будут генериться автоматически, и вам не придется создавать отдельные формы для редактирования различных данных. Вот это я понимаю универсальность, тут работы как раз по созданию форм редактирования полно как правило.
Единственный минус это явно передавать текущий bindingSource, но это думаю не проблема.
...
Рейтинг: 0 / 0
Как правильно использовать BindingNavigator
    #36409892
vinvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этот код будет работать неправильно!

Код: plaintext
1.
2.
3.
4.
5.
6.
private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
{
  if (MessageBox.Show("Вы уверены, что хотите удалить?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
  {
     myBindingSource.RemoveCurrent();
  }
}

Дело в том, что к bindingNavigatorDeleteItem.Click уже привязано действие по удалению текущей записи. Т.е. сначала будет удалена строка (выполниться встроенный код), ну а потом выполниться наше привязанное действие!
...
Рейтинг: 0 / 0
Как правильно использовать BindingNavigator
    #36410480
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vinvinЭтот код будет работать неправильно!

Код: plaintext
1.
2.
3.
4.
5.
6.
private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
{
  if (MessageBox.Show("Вы уверены, что хотите удалить?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
  {
     myBindingSource.RemoveCurrent();
  }
}

Дело в том, что к bindingNavigatorDeleteItem.Click уже привязано действие по удалению текущей записи. Т.е. сначала будет удалена строка (выполниться встроенный код), ну а потом выполниться наше привязанное действие!
Тогда создать свою кнопку у которой этого побочного события нет, кнопка содается в 2 клика ;)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как правильно использовать BindingNavigator
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]