0

エンティティ フレームワークは初めてですが、これはかなり単純なはずだと思います。

私のフォーム ロードは、私のエンティティからコンテキストを作成します。クライアントのリストを作成し、クライアントを割り当てるバインディング ソースを用意します。バインディング ソースは、Binding Navigator (clientBindingNavigator) に割り当てられます。

private void ClientExtForm_Load (object sender, EventArgs e)
        {

        _context = new IDVisitorEntities ();

        List<IDVM.Client> clients = _context.Clients.ToList ();

        clientBindingSource.DataSource = clients;

        }

ClientExtForm.Designer.cs からの抜粋

        //
        // clientBindingNavigator
        // 
        this.clientBindingNavigator.AddNewItem = this.bindingNavigatorAddNewItem;
        this.clientBindingNavigator.BindingSource = this.clientBindingSource;
        this.clientBindingNavigator.CountItem = this.bindingNavigatorCountItem;
        this.clientBindingNavigator.DeleteItem = this.bindingNavigatorDeleteItem;
        this.clientBindingNavigator.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
        this.bindingNavigatorMoveFirstItem,
        this.bindingNavigatorMovePreviousItem,
        this.bindingNavigatorSeparator,
        this.bindingNavigatorPositionItem,
        this.bindingNavigatorCountItem,
        this.bindingNavigatorSeparator1,
        this.bindingNavigatorMoveNextItem,
        this.bindingNavigatorMoveLastItem,
        this.bindingNavigatorSeparator2,
        this.bindingNavigatorAddNewItem,
        this.bindingNavigatorDeleteItem,
        this.clientBindingNavigatorSaveItem});

ナビゲーター ツールバーの [削除] ボタンをクリックすると、 ClientBindingSource.Count が 1 減ります。

private void clientBindingNavigatorSaveItem_Click (object sender, EventArgs e)
        {
        this.OnSave ();
        }



public override void OnSave ()
        {

        foreach (ObjectStateEntry entry in _context.ObjectStateManager.GetObjectStateEntries (EntityState.Deleted))
            {
           // nothing shows up in this
            }            
        foreach (ObjectStateEntry entry in _context.ObjectStateManager.GetObjectStateEntries (EntityState.Modified))
            {
            // when modified 
            }

        foreach (ObjectStateEntry entry in _context.ObjectStateManager.GetObjectStateEntries (EntityState.Added))
            {
            // when adding this finds it                    
            }

        clientBindingSource.EndEdit ();

        visitorHostsBindingSource.EndEdit ();

        _context.SaveChanges ();

        base.OnSave (); 
        }

ナビゲーターがアイテムをコレクションから削除しているように見えます。

追加情報: ナビゲーターでは、DeleteItem ボタンが RemoveCurrent メソッドに対応しているようです (クリック イベントでそれが呼び出されます)。RemoveCurrent がそれを行う前に結び付ける方法がわかりません。

削除を実行するためのオプションは何ですか?

4

3 に答える 3

0

見回した後、デフォルトのDeleteItemを使用しないことを提案するいくつかのブログを見つけました。

this.clientBindingNavigator.DeleteItem = null;//= this.bindingNavigatorDeleteItem;

私の場合、BindingNavigator を明確にするために、アイテム リストでthis.bindingNavigatorDeleteItem を新しいボタンthis.toolStripButton1に置き換えました。

this.clientBindingNavigator.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
        this.bindingNavigatorMoveFirstItem,
        this.bindingNavigatorMovePreviousItem,
        this.bindingNavigatorSeparator,
        this.bindingNavigatorPositionItem,
        this.bindingNavigatorCountItem,
        this.bindingNavigatorSeparator1,
        this.bindingNavigatorMoveNextItem,
        this.bindingNavigatorMoveLastItem,
        this.bindingNavigatorSeparator2,
        this.bindingNavigatorAddNewItem,
        this.toolStripButton1,
        this.clientBindingNavigatorSaveItem});

新しいボタンの作成は次のようになります。

        // 
        // toolStripButton1
        // 
        this.toolStripButton1.Image = ((System.Drawing.Image) (resources.GetObject ("bindingNavigatorDeleteItem.Image")));
        this.toolStripButton1.RightToLeftAutoMirrorImage = true;
        this.toolStripButton1.Name = "toolStripDeleteItem";
        this.toolStripButton1.Size = new System.Drawing.Size(23, 22);
        this.toolStripButton1.Text = "Delete";
        this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click);

その後、Click イベントは RemoveCurrent を呼び出しますが (既定の場合と同様)、現在のエンティティを取得して、保存時に使用するために配列リストに格納できます。

private void toolStripButton1_Click (object sender, EventArgs e)
        {
        var currentclient = (Client) clientBindingSource.Current;
        clientstodelete.Add (currentclient);
        clientBindingSource.RemoveCurrent ();
        }

新しいボタンを作成する必要はありませんでした。ボタンに関連付けられていない this.clientBindingNavigator.DeleteItem が必要でした。DeleteItem は、BindingSource.RemoveCurrent() を呼び出す内部でクリック イベントを作成するためです。ボタンを作成したデフォルトのボタンに戻すかもしれませんが、説明のために、何が起こっているのかをみんなに見てもらいたいと思いました.

于 2012-08-14T18:55:08.713 に答える
0

clientBindingSource からアイテムを削除しても、データベース レベルのアイテムには影響しません。明示的に呼び出す_context.Clients.DeleteObject(deletedClient);必要があります ObjectContext を介してすべての CRUD 操作を実行する必要があります。

于 2012-08-13T21:49:31.993 に答える
0

RemoveCurrent() を使用して削除したばかりの場合、テーブルから直接レコードを削除する必要があるのは奇妙に思えることに同意します。しかし、それはそれです...これにより、データグリッドビューとデータソースのレコードが1回のクリーンスイープで処理されました。

これが私が問題を解決した方法です:

        t_StaffDaysOff sdo = (t_StaffDaysOff)t_StaffDaysOffbindingSource.Current;
        t_StaffDaysOffbindingSource.RemoveCurrent();
        t_StaffDaysOffbindingSource.EndEdit();
        db.t_StaffDaysOff.Remove(sdo);
        db.SaveChanges();
于 2017-10-08T14:26:44.500 に答える