Entity Framework használata binding navigator-ral?

Entity Framework használata binding navigator-ral?
2016-11-09T10:39:27+01:00
2016-11-11T13:11:19+01:00
2022-10-15T23:15:19+02:00
iolah2
Sziasztok Entity Framework 6 Database First eszközt használok C#-ban.
Találtam olyan EntityDatasource és BindingNavigator-t tartalmazó dll-t ami képes rá, hogy az Entityt kiválasztva módosítson, mentsen, visszavonjon adatokat. 
A gondom az, hogy én név és nem ID szerint rendezve szeretném kezdetben kikérni az Entity-ből az adatokat.

Kérdésem az lenne, ha binding source-ot használnék akkor hogy lehet a módosításokat legkönnyebben nyomon követni? 

Elöbbi vagy utobbi pont érdekelne.

Innen vettem ötletet: Entity Framework in WinForms - CodeProject
Csak sajnos a név szerinti rendezést nem tudom hol kell átállítani, beleépíteni.
Mutasd a teljes hozzászólást!
Hi,
1. akarmi.ItemsSource(?)=Model.Tabla.OrderBy(m=>m.Nev);
2. pontosan mire gondolsz?

B
Mutasd a teljes hozzászólást!

  • A korábban mellékelt e-mail címről letöltve EF6 alatt az alábbi EntityBindingNavigator-el akadt gondom. Datasource + Datamember amit használ, így az EDMX elérhetőségével dolgozik.

    Ehelyett én a hagyományos Bindingsource kapcsolást szeretném beleírni a "sort" lehetőséggel.

    Itt alapvetően az EntityDataSource részek amiket módosítani kellene, de hogyan azt nem tudom.

    Esetleg elérhető valahol a form alapértelmezet bindingnavigator-jának a háttérkódja?

    Valahogy az is kellene a bindingnavigatorba, hogy a mentés, törlés stb funkciókat is be lehessen állítani.

    using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; namespace EFWinforms { /// <summary> /// DataSource component that exposes EntityFramework ObjectSet and provides navigation, /// add/remove, and save/cancel changes buttons. /// </summary> /// <remarks> /// This class contains a <see cref="EntityDataSource"/> and exposes one of the /// entity sets available for binding. /// </remarks>r [ ToolboxItem(true), ToolboxBitmap(typeof(EntityBindingNavigator), "EntityBindingNavigator.png"), DefaultProperty("DataSource"), ComplexBindingProperties("DataSource", "DataMember") ] public partial class EntityBindingNavigator : ToolStrip { //------------------------------------------------------------- #region ** fields object _dataSource; string _dataMember = string.Empty; CurrencyManager _cm; bool _showBtnNav, _showBtnAdd, _showBtnSave; //private IContainer components; #endregion //------------------------------------------------------------- #region ** ctor /// <summary> /// Initializes a new instance of a <see cref="EntityBindingNavigator"/>. /// </summary> public EntityBindingNavigator() { InitializeComponent(); Dock = DockStyle.Top; ShowNavigationButtons = ShowAddRemoveButtons = ShowSaveUndoRefreshButtons = true; UpdateUI(); } #endregion //------------------------------------------------------------- #region ** object model /// <summary> /// Gets or sets the data source for this navigator. /// </summary> [ DefaultValue(null), AttributeProvider(typeof(IListSource)) ] public object DataSource { get { return _dataSource; } set { _dataSource = value; UpdateCurrencyManager(); } } /// <summary> /// Gets or sets the specific list in a <see cref="DataSource"/> object that the navigator should display. /// </summary> [ DefaultValue(""), Editor("System.Windows.Forms.Design.DataMemberListEditor, System.Design", typeof(System.Drawing.Design.UITypeEditor)) ] public string DataMember { get { return _dataMember; } set { _dataMember = value; UpdateCurrencyManager(); } } /// <summary> /// Sets the DataSource and DataMember properties at the same time. /// </summary> public void SetDataBinding(object dataSource, string dataMember) { _dataSource = dataSource; _dataMember = dataMember; UpdateCurrencyManager(); } /// <summary> /// Gets a reference to the list being managed by this navigator. /// </summary> [ Browsable(true) ] public IBindingList List { get { return _cm != null ? _cm.List as IBindingList : null; } } /// <summary> /// Gets the item that is currently selected. /// </summary> [ Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public object CurrentItem { get { return _cm != null ? _cm.Current : null; } } /// <summary> /// Gets or sets the index of the item that is currently selected. /// </summary> [ Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public int Position { get { return _cm != null ? _cm.Position : -1; } set { if (_cm != null) _cm.Position = value; } } /// <summary> /// Gets or sets whether the control should display the navigation buttons. /// </summary> [ DefaultValue(true) ] public bool ShowNavigationButtons { get { return _showBtnNav; } set { _showBtnNav = _btnFirst.Visible = _btnPrev.Visible = _btnNext.Visible = _lblCurrent.Visible = _btnLast.Visible = _sepNav.Visible = value; } } /// <summary> /// Gets or sets whether the control should display the add/remove item buttons. /// </summary> [ DefaultValue(true) ] public bool ShowAddRemoveButtons { get { return _showBtnAdd; } set { _showBtnAdd = _btnAdd.Visible = _btnRemove.Visible = _sepAddRemove.Visible = value; } } /// <summary> /// Gets or sets whether the control should display the save/undo/refresh buttons. /// </summary> [ DefaultValue(true) ] public bool ShowSaveUndoRefreshButtons { get { return _showBtnSave; } set { _showBtnSave = _btnSave.Visible = _btnUndo.Visible = _btnRefresh.Visible = value; } } #endregion //------------------------------------------------------------- #region ** events /// <summary> /// Occurs when the current item changes. /// </summary> public event EventHandler PositionChanged; /// <summary> /// Raises the <see cref="PositionChanged"/> event. /// </summary> /// <param name="e"></param> protected virtual void OnPositionChanged(EventArgs e) { PositionChanged?.Invoke(this, e); } /// <summary> /// Occurs when the current item changes. /// </summary> public event ListChangedEventHandler ListChanged; /// <summary> /// Raises the <see cref="ListChanged"/> event. /// </summary> /// <param name="e"></param> protected virtual void OnListChanged(ListChangedEventArgs e) { ListChanged?.Invoke(this, e); } /// <summary> /// Occurs before a new item is added to the list. /// </summary> public event CancelEventHandler AddingNew; /// <summary> /// Raises the <see cref="AddingNew"/> event. /// </summary> /// <param name="e"><see cref="CancelEventArgs"/> that contains the event parameters.</param> protected virtual void OnAddingNew(CancelEventArgs e) { AddingNew?.Invoke(this, e); } /// <summary> /// Occurs after a new item is added to the list. /// </summary> public event EventHandler AddedNew; /// <summary> /// Raises the <see cref="AddedNew"/> event. /// </summary> /// <param name="e"><see cref="EventArgs"/> that contains the event parameters.</param> protected virtual void OnAddedNew(EventArgs e) { AddedNew?.Invoke(this, e); } /// <summary> /// Occurs before an item is removed from the list. /// </summary> public event CancelEventHandler RemovingItem; /// <summary> /// Raises the <see cref="RemovingItem"/> event. /// </summary> /// <param name="e"><see cref="CancelEventArgs"/> that contains the event parameters.</param> protected virtual void OnRemovingItem(CancelEventArgs e) { RemovingItem?.Invoke(this, e); } /// <summary> /// Occurs after an item is removed from the list. /// </summary> public event EventHandler RemovedItem; /// <summary> /// Raises the <see cref="RemovedItem"/> event. /// </summary> /// <param name="e"><see cref="EventArgs"/> that contains the event parameters.</param> protected virtual void OnRemovedItem(EventArgs e) { RemovedItem?.Invoke(this, e); } #endregion //------------------------------------------------------------- #region ** overrides /// <summary> /// Update the internal CurrencyManager when the BindingContext changes. /// </summary> /// <param name="e"></param> protected override void OnBindingContextChanged(EventArgs e) { base.OnBindingContextChanged(e); UpdateCurrencyManager(); } /// <summary> /// Gets or sets how the control is docked in the parent container. /// </summary> [DefaultValue(DockStyle.Top)] public override DockStyle Dock { get { return base.Dock; } set { base.Dock = value; } } #endregion //------------------------------------------------------------- #region ** implementation ToolStripButton _btnFirst, _btnPrev, _btnNext, _btnLast; ToolStripLabel _lblCurrent; ToolStripButton _btnSave, _btnUndo, _btnRefresh; ToolStripButton _btnAdd, _btnRemove, _btnEdit; ToolStripSeparator _sepNav, _sepAddRemove; void InitializeComponent() { _btnFirst = new ToolStripButton("First Record", Properties.Resources.FirstRecord_small, _btnFirst_Click); _btnPrev = new ToolStripButton("Previous Record", Properties.Resources.PreviousRecord_small, _btnPrev_Click); _lblCurrent = new ToolStripLabel("0 of 0"); _btnNext = new ToolStripButton("Next Record", Properties.Resources.NextRecord_small, _btnNext_Click); _btnLast = new ToolStripButton("Last Record", Properties.Resources.LastRecord_small, _btnLast_Click); foreach (var btn in new ToolStripButton[] { _btnFirst, _btnPrev, _btnNext, _btnLast }) { btn.DisplayStyle = ToolStripItemDisplayStyle.Image; Items.Add(btn); } Items.Insert(2, _lblCurrent); _sepNav = new ToolStripSeparator(); Items.Add(_sepNav); _btnAdd = new ToolStripButton("Add Item", Properties.Resources.addBtn_Image, _btnAdd_Click);//("Add Item", Properties.Resources.NewItem_small, _btnAdd_Click); _btnRemove = new ToolStripButton("Remove Item", Properties.Resources.deleteBtn_Image, _btnRemove_Click); _btnSave = new ToolStripButton("Save", Properties.Resources.Save_small, _btnSave_Click); _btnEdit = new ToolStripButton("Edit", Properties.Resources.editBtn_Image, _btnEdit_Click); _btnUndo = new ToolStripButton("Undo", Properties.Resources.cancelBtn_Image, _btnCancel_Click); foreach (var btn in new ToolStripButton[] { _btnAdd, _btnEdit, _btnUndo, _btnSave, _btnRemove }) { btn.DisplayStyle = ToolStripItemDisplayStyle.Image; Items.Add(btn); } _sepAddRemove = new ToolStripSeparator(); Items.Add(_sepAddRemove); _btnRefresh = new ToolStripButton("Refresh", Properties.Resources.refreshBtn_Image, _btnRefresh_Click); foreach (var btn in new ToolStripButton[] { _btnRefresh })//, _btnUndo, _btnSave }) { btn.DisplayStyle = ToolStripItemDisplayStyle.Image; //btn.Alignment = ToolStripItemAlignment.Right; Items.Add(btn); } foreach (ToolStripItem item in Items) { item.Visible = true; } } // update UI when postion/list changes void _cm_PositionChanged(object sender, EventArgs e) { UpdateUI(); OnPositionChanged(e); } void _cm_ListChanged(object sender, ListChangedEventArgs e) { if (e.ListChangedType != ListChangedType.ItemChanged) { UpdateUI(); } OnListChanged(e); } void UpdateUI() { if (_cm != null) { _lblCurrent.Text = string.Format("{0} of {1}", _cm.Position + 1, _cm.Count); _btnFirst.Enabled = _btnPrev.Enabled = _cm.Position > 0; _btnLast.Enabled = _btnNext.Enabled = _cm.Position < _cm.Count - 1; var bl = _cm.List as IBindingList; _btnAdd.Enabled = bl != null && bl.AllowNew; _btnRemove.Enabled = bl != null && bl.AllowRemove; _btnEdit.Enabled = bl != null && bl.AllowEdit; } else { _btnFirst.Enabled = _btnPrev.Enabled = false; _btnLast.Enabled = _btnNext.Enabled = false; _btnAdd.Enabled = _btnRemove.Enabled = _btnEdit.Enabled = false; } _btnAdd.Enabled=_btnSave.Enabled = _btnUndo.Enabled = _btnRefresh.Enabled = EntityDataSource != null; } // navigation void _btnFirst_Click(object sender, EventArgs e) { if (_cm != null) { _cm.Position = 0; } } void _btnPrev_Click(object sender, EventArgs e) { if (_cm != null && _cm.Position > 0) { _cm.Position--; } } //private void InitializeComponent() //{ // this.SuspendLayout(); // this.ResumeLayout(false); //} void _btnNext_Click(object sender, EventArgs e) { if (_cm != null && _cm.Position < _cm.Count - 1) { _cm.Position++; } } void _btnLast_Click(object sender, EventArgs e) { if (_cm != null) { _cm.Position = _cm.Count - 1; } } // add/remove records public void _btnAdd_Click(object sender, EventArgs e) { // notify var ce = new CancelEventArgs(); OnAddingNew(ce); if (_cm != null && _cm.List is IBindingList && !ce.Cancel) { // add new var bl = _cm.List as IBindingList; var newItem = bl.AddNew(); // notify OnAddedNew(e); // make sure new item is selected _cm.Position = bl.IndexOf(newItem); } } void _btnRemove_Click(object sender, EventArgs e) { // notify var ce = new CancelEventArgs(); OnRemovingItem(ce); if (_cm != null && _cm.Current != null && _cm.List is IBindingList && !ce.Cancel) { // remove current item var bl = _cm.List as IBindingList; bl.Remove(_cm.Current); // notify OnRemovedItem(e); } } // save/cancel/refresh void _btnSave_Click(object sender, EventArgs e) { if (EntityDataSource != null) { try { EntityDataSource.SaveChanges(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } void _btnEdit_Click(object sender, EventArgs e) { //Szerkeszthetőség engedélyezése??? } void _btnCancel_Click(object sender, EventArgs e) { if (EntityDataSource != null) { //if(EntityDataSource.) //{ //} EntityDataSource.CancelChanges(); } } void _btnRefresh_Click(object sender, EventArgs e) { if (EntityDataSource != null) { EntityDataSource.Refresh(); } } // update the currency manager to handle a new DataSource, DataMember, or BindingContext void UpdateCurrencyManager() { // disconnect old if (_cm != null) { _cm.PositionChanged -= _cm_PositionChanged; _cm.ListChanged -= _cm_ListChanged; } // get new currency manager _cm = null; if (DataSource != null && Parent != null && BindingContext != null) { try { _cm = BindingContext[DataSource, DataMember] as CurrencyManager; } catch { } } // connect new if (_cm != null) { _cm.PositionChanged += _cm_PositionChanged; _cm.ListChanged += _cm_ListChanged; } // show UI UpdateUI(); } EntityDataSource EntityDataSource { get { return _dataSource as EntityDataSource; } } #endregion } }
    Mutasd a teljes hozzászólást!
  • H,
    A legutóbbi kérdésed merőben eltér az eredeti kérdéstől, de (igyekszem a kérdésekre válaszolni):
    1. Nem tudod ezzel a komponenssel a bindingsource-ot kötni? A kódból az látszik, hogy lehet kötni hozzá.
    2. Csak én nem látom az EntityDataSource deklarációját?
    3. erre gondolsz? View the source code for .NET classes
    4. Abba kell a mentés, törlés stb ami neked van gondolom. Nem varázslat: plusz 2+n gomb, azok click eseményére kezelő, ami továbbküldi a click eseményt a te kezelődre.

    B
    Mutasd a teljes hozzászólást!
  • Szia
    Bocsi tudom ez kicsit más téma, de jobban érdekelne:

    Ms sql-t használok Entity Framework-al.

    Van nullable int oszlopom, alapértéke 0. Kitöltve ms sql-ben DBNull került bele, ezt az EF edmx átalakította null-értékké. 

    Ezután databinding-oltam egy numericUpDown-hoz, ahol defaultra(DBNull-ra) 0-át állítottam.

    Gond hogy mivel a binding-nál null értéket és nem dbnull-t kap így elszáll. Mi a teendő?

    Esetleg teljesen zárjam ki a nullozható oszlopokat, vagy használjak valami konvertálást? Ha utóbbi a jobb azt hogyan.

    Inkább ezen kérdésre fogadnám majd el a választ.
    Mutasd a teljes hozzászólást!
  • Adj neki dbnull-t null helyett.
    Mutasd a teljes hozzászólást!
  • Na de azt hogyan? Az entity framework edmx alapból nullra konvertálja. Most ezt databinding-nál hol lehetne,
    Mutasd a teljes hozzászólást!
  • Részletezve:
    Adatkötés:

    numericUpDown1.DataBindings.Add("Value", bindingSource1, "Suitability",false, DataSourceUpdateMode.OnPropertyChanged, 0);
    Ha a bindingsource-nak új Entity Framework elemet adok, ott a nullable oszlop még nem kap default értéket. Így viszont az adatkötésbe kellene valami szűrés, átkonvertálás.

    Ugye az Entitytől a null-t kapja vissza, de ebből hogy legyen default vagy dbnull.

    Esetleg inkább írjam át az egész konstruktorát az Entity-nek, vagy van nem sétagalop módszer is?
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd