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

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

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

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

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

Данные я в источник получаю через 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
11.01.2010, 11:34
    #36403161
Как правильно использовать BindingNavigator
vinvin,

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

Код: 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
13.01.2010, 08:55
    #36406720
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно использовать BindingNavigator
Код: 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
13.01.2010, 09:01
    #36406726
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно использовать BindingNavigator
автор2) При добавлении строки - вызываю форму для редактирования. Если пользователь не захотел сохранять новую строку что дель с вновь добавленным элементом - неужели удалять?

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

У вас видимо сделано так:
1. Добавляете новую запись в БД
2. Открываете форму для редактирования
3.1. Нажимаете кнопку сохранить [Запись апдейтица]
3.2. Нажимаете кнопку отмена [Запись удаляется из БД]
4. Закрываете форму
...
Рейтинг: 0 / 0
13.01.2010, 21:11
    #36408503
vinvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно использовать BindingNavigator
Дело в том, что я работаю с сервисами данных и с 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
14.01.2010, 10:03
    #36408928
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно использовать BindingNavigator
А теперь стало ясно.

Код: 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
14.01.2010, 14:25
    #36409892
vinvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно использовать BindingNavigator
Этот код будет работать неправильно!

Код: 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
14.01.2010, 17:22
    #36410480
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно использовать BindingNavigator
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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как правильно использовать BindingNavigator / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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