2012-09-24 3 views
2

BindingSource.AddingNew 이벤트 처리기에서 항목을 추가하는 것을 취소 할 수 있습니까?BindingSource cancel AddingNew

사용자가 BindingNavigator에있는 "새 추가"버튼을 클릭하면 유효한 파일을 반환하거나 표시하지 않을 수있는 대화 상자가 열려 있습니다. 내가 핸들러 내부의 값으로 e.NewObject 설정을 설정하지 않아도

void bindingSource_AddingNew(object sender, AddingNewEventArgs e) 
{ 
    using (var dialog = new OpenFileDialog()) 
    { 
     var result = dialog.ShowDialog(); 

     // user canceled? 
     if (result == DialogResult.Cancel) 
      return; 

     // TryLoad will return null on failure 
     var data = TryLoad(dialog.FileName); 

     // only add the item to the grid if not null 
     if (data != null) 
      e.NewObject = data; 
    } 
} 

, 새로운 ("빈") 항목이있는 DataGridView에 나타납니다 : 지금, 나는 이런 식으로 뭔가가있다.

항목 추가를 취소 할 수 있습니까?

+0

: 편집 예를 들어 데이터베이스에 업로드 (의 텍스트 상자가 contactsBindingSource에 바인더 제본하는) 추가/편집 대화 형태 코드의이 라인을 사용하는 유효한 데이터를 입력 '그것은 당신을 위해 하나를 만듭니다. – edokan

답변

3

간단한 해결책 :

  1. 지우기 속성 창에서 BindingNavigator "AddNewItem"속성, 그것은 AddingNew BindingSource에 발생하지 않도록.
  2. bindingNavigator이 더하기 단추를 클릭 이벤트를 생성하고 수동으로 다음과 같이 새로운 항목 추가 절차를 제어 할 수의 더하기 (+) 기호
  3. 더블 클릭 :

    private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e) 
    { 
        using (var dialog = new OpenFileDialog()) 
        { 
         if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
         { 
          var data = TryLoad(dialog.FileName); ; 
    
          if (data != null) 
          { 
           myBindingSource.Add(data); 
          } 
         } 
        } 
    } 
    
+0

고마워, 내가 원한거야. 단순하고, 반사가없고, 의도 된 것이 없습니다. 나는 이러한 속성이 존재하는지 전혀 몰랐다. 큰! – Lou

4

BindingSource가 ICancelAddNew 인터페이스를 구현하는 경우 새로 추가 된 개체에서 CancelNew를 호출하여 되돌릴 수 있어야합니다. AddNew에 대한 이벤트 처리기에서이 방법을 시도해 보길 권장하지 않습니다. 이 인터페이스를 사용하면 항목이 여전히 목록에 추가되지만 EndNew()가 트랜잭션을 커밋하고 보류 상태 인 경우 CancelNew()가 트랜잭션을 되돌릴 수 있습니다. 당신이 당신의 자신의 ICancelNew이 this old blog post 체크 아웃 구현에 대해 어떻게 이동하는 방법에 대한 링크를 원하는 경우

public void MyFunctionWhereIAddNew() 
{ 
    var item = _myBindingSource.AddNew(); 

    item.SetSomeParams(...); 

    if(item.CheckItemForSuccess() != true) 
    { 
     _myBindingSource.CancelNew(_myBindingSource.IndexOf(item)); 
    } 
} 

다음 BindingList이 ICancelNew를 구현하고 당신이 그런 짓을 할 수 있도록 할 것 같습니다.

+0

감사. 그러나 BindingNavigator (코드에서'AddNew'를 호출하지 않음)를 통해 행을 추가하는 경우'AddingNew' 이벤트 만 발생합니다. – Lou

+0

AddingNew 이벤트에 대한 이벤트 수신기를 어떻게 추가합니까? BindingNavigator에 대한 BindingSource를 어떻게 만듭니 까? – ShelbyZ

+0

목록을 BindingSource의 데이터 소스로 사용합니다. List list = GetData(); bindingSource.DataSource = list;', BindingSource를 그리드와 네비게이터의 데이터 소스로 사용합니다 :'dataGridView.DataDource = bindingSource; bindingNavigator.DataSource = 바인딩 소스; 이렇게하면 나에게 Grid + Navigator 기능이 기본적으로 제공되지만 사용자가 BindingNavigator 컨트롤에서 "추가"버튼을 클릭하면 추가를 취소 할 수 없습니다. – Lou

2

도 가능하지만 매우 못생긴 방식입니다. 추가 버튼 BindingNavigator의 클릭 이벤트를 재정의해야합니다. 솔루션은 테스트 및 작동하에 제공되지만 어떤 프로덕션 시스템에도 적합하지 않습니다. 프로덕션 시스템에서 이벤트 처리기를 재정렬하기 위해 이와 같은 코드 하나가 있습니다. 나는 그것을 좋아하지 않지만 작동한다.

public partial class Form1 : Form 
{ 
    public MethodInfo refreshMethod; 
    public Form1() 
    { 
     InitializeComponent(); 

     // Build Data 
     var list = new List<MyData> 
      { 
       new MyData {Id = 1, Str = "1"}, 
       new MyData {Id = 2, Str = "2"} 
      }; 

     //Bind Data 
     bindingSource1.DataSource = list; 
     dataGridView1.DataSource = bindingSource1; 
     bindingNavigator1.BindingSource = bindingSource1; 

     // get event handler storage property 
     var eventsProperty = bindingNavigator1.AddNewItem.GetType().GetProperty(
      "Events", 
      BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Instance 
      ); 

     // get key for click event 
     var clickField = bindingNavigator1.AddNewItem.GetType().GetField(
      "EventClick", 
      BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Static 
      ); 

     var clickKey = clickField.GetValue(null); 

     // find refresh method 
     refreshMethod = bindingNavigator1.GetType().GetMethod(
      "RefreshItemsInternal", 
      BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Instance 
      ); 

     // get storage instance 
     var handlers = (EventHandlerList)eventsProperty.GetValue(bindingNavigator1.AddNewItem, null); 
     // find click event handlers 
     var clickEventHandlers = handlers[clickKey]; 

     // remove current handlers 
     var handlerInvocationList = clickEventHandlers.GetInvocationList(); 
     for (int index = 0; index < handlerInvocationList.Length; index++) 
      handlers.RemoveHandler(clickKey, handlerInvocationList[index]); 

     // attach our new handler 
     handlers.AddHandler(clickKey, new EventHandler(NewAddNewHandler)); 
    } 

    private void NewAddNewHandler(object sender, EventArgs e) 
    { 
     if (bindingNavigator1.Validate() && null != bindingNavigator1.BindingSource) 
     { 
      var result = MessageBox.Show("Add new?", "Are you..", MessageBoxButtons.YesNo) == DialogResult.Yes; 

      if (!result) 
       return; 

      bindingNavigator1.BindingSource.AddNew(); 
      refreshMethod.Invoke(bindingNavigator1, null); 
     } 
    } 

} 
1

버튼으로 추가를 처리 할 수 ​​있습니까? 그렇다면 DataGridView의 Add 메서드를 호출하기 전에 단추 클릭 이벤트를 설정하여 모든 매개 변수를 확인할 수 있습니다.

1

definatly 약간의 추가를 필요로 한 간단한 솔루션 전에는 아무것도 생산 방식으로 만들기 전에 bindingnavigators에서 편집을 취소하는 것입니다 AddNew 이벤트를 클릭하십시오.

bindingSource_AddingNew (..)에서 편집을 취소 할 것인지를 나타내는 부울 값을 설정해야합니다.

  
private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e) 
{  
    if(cancelEdit) 
     bindingSource.CancelEdit(); 
} 
0

둘 다 추가하거나 편집 새 행을 추가 취소하고 받아들이 BindingSource.EndEdit()를 사용할 필요가 단순히 언제든지 BindingSource.CancelEdit() 기능을 사용할 수있는 몇 가지 데이터 소스에서 테이블의 데이터와 최종 수있는 대화 상자 폼을 ​​표시하는 경우 당신은`e.NewObject를 설정하지 않으면

Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click 
    contactsBindingSource.EndEdit() 
    contactsTableAdapter.Update(contactsTable) 
    contactsTable = contactsTableAdapter.GetData() 
End Sub 

Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click 
    contactsBindingSource.CancelEdit() 
    contactsTable = contactsTableAdapter.GetData() 
End Sub