2013-05-15 3 views
0

Контекст: У меня есть TreeView в одной из моих форм. В зависимости от выбора этого TreeView я загружаю UserControl в панель. Один pannel только для чтения, но в другой панели пользователь может модифицировать/добавлять данные, которые я сохраняю в базе данных. Если пользователь попытается сделать новый выбор в TreeView (событие BeforeSelect), и он находится во втором элементе управления (mod/add), и у него есть несохраненные данные, я хочу спросить его, хочет ли он сохранить до загрузки нового элемента управления. Проблема заключается в том, что при появлении сообщения появляется событие, которое потеряло фокус и вызывается в цикле (около 20 раз). Кроме того, независимо от того, что пользователь нажимает на окно сообщения (да сохранить или нет просто загрузить новый элемент управления), как никакого влияния.Как использовать почтовый ящик в обработчике событий

Так что мой вопрос: есть ли все-таки спросить пользователя, что он хочет делать в обработчике событий?

Я надеюсь, что было ясно прийти, извините английский не является моим первым языка сайта

/редактировать

Вот код из BeforeSelect и IsCtrlFormUnsave

private void tv_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
{ 
    if (IsCtrlFormUnsave()) 
    { 
     e.Cancel = true; 
     //Invoke(new Action(AvertirUser)); //this is in case the save action didn't worked 
    } 
} 

private bool IsCtrlFormUnsave() 
{ 
    if (_ctrlForm != null && _ctrlForm.unsavedChange) 
    { 
     DialogResult dr = MessageBox.Show("Le formulaire présentement ouvert contient des données qui n'ont pas été sauvegardées. Voulez-vous les enregistrés avant de poursuivre?", 
               "Attention!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); 
     if (dr == DialogResult.Yes) 
      if (!_ctrlForm.Save()) 
       return true; 

     _ctrlForm = null; 
    } 
    return false; 
} 

Функция AvertirUser только containt сообщение

+0

Вы можете разместить некоторые примеры кода, чтобы помочь нам понять, что вы говорите? –

+0

@JesseCarter там вы идете –

+0

Возможно, вам нужно рассмотреть возможность поиска в другом мероприятии, чтобы получить желаемый эффект. Возможно, вы подключаетесь к LoseFocus на _ctrlForm, прежде чем вы сможете даже выбрать новый элемент TreeViewItem. –

ответ

1

Добавьте метод Close() к своему UserControl и разместите там код сообщения. Тогда он может назвать свой собственный метод Save():

public void Close() 
    { 
     if (this.unsavedChange) 
     { 
      DialogResult dr = MessageBox.Show("Le formulaire présentement ouvert contient des données qui n'ont pas été sauvegardées. Voulez-vous les enregistrés avant de poursuivre?", 
                "Attention!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); 
      if (dr == DialogResult.Yes) 
      { 
       this.Save(); 
      } 
     } 
    } 

Назад в форме, вы можете сделать:

private void tv_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
    { 
     if (_ctrlForm != null) 
     { 
      _ctrlForm.Close(); 
      _ctrlForm.Dispose(); 
      _ctrlForm = null; 
     } 
    } 
1

вам нужно проверить, является ли выбор действием пользователя или реверсом т действие пользователя отменить т.д.

один способ фиксации это добавить еще bool значение:

bool IsChecked=false; 
private void tv_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
{ 
    if (!IsChecked && IsCtrlFormUnsave()) //Check if it's already confirmed with the user 
    { 
     e.Cancel = true;   
    } 
} 

private bool IsCtrlFormUnsave() 
{ 
    IsChecked=true; //set it to true to jump out of the loop 
    if (_ctrlForm != null && _ctrlForm.unsavedChange) 
    { 

     DialogResult dr = MessageBox.Show("Le formulaire présentement ouvert contient des données qui n'ont pas été sauvegardées. Voulez-vous les enregistrés avant de poursuivre?", 
               "Attention!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); 
     if (dr == DialogResult.Yes) 
      if (!_ctrlForm.Save()) 
       return true; 

     _ctrlForm = null; 
    } 
    return false; 
} 

И не забудьте сбросить IsChecked=false при загрузке second control снова.