[C#/WinForms] Problème avec binding à une grille + RealProxy

Problème avec binding à une grille + RealProxy [C#/WinForms] - C#/.NET managed - Programmation

Marsh Posté le 02-03-2007 à 00:25:02    

Bonsoir,
 
J'ai un problème étrange avec les DataSource de DataGridView
J'ai créé une Form, posé une DataGridView dessus.
 
edit : oubli
J'ai créé une colonne de type DataGridViewTextBoxColumn, avec sa propriété  DataPropertyName à "Prop"
 
Puis j'ai écrit le code ci-dessous :
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Runtime.Remoting;
  9. using System.Runtime.Remoting.Proxies;
  10. using System.Runtime.Remoting.Messaging;
  11. using System.Reflection;
  12. using System.Diagnostics;
  13. namespace TestDataGridSource
  14. {
  15.     public partial class Form1 : Form
  16.     {
  17.         public Form1()
  18.         {
  19.             InitializeComponent();
  20.         }
  21.         class BO : MarshalByRefObject
  22.         {
  23.             string prop;
  24.             public string Prop { get { return prop; } set { prop = value; } }
  25.             private BO() { }
  26.             public static BO CreateNew()
  27.             {
  28.                 // Décommenter une des 2 lignes
  29.                 //return new BO();
  30.                 return (BO)new Prox(new BO()).GetTransparentProxy();
  31.             }
  32.         }
  33.         class Prox : RealProxy
  34.         {
  35.             BO o;
  36.             public Prox(BO o)
  37.                 : base(typeof(BO))
  38.             { this.o = o; }
  39.             public override IMessage Invoke(IMessage msg)
  40.             {
  41.                 return RemotingServices.ExecuteMessage(o, (IMethodCallMessage)msg);
  42.             }
  43.         }
  44.         private void Form1_Load(object sender, EventArgs e)
  45.         {
  46.             BindingList<BO> list = new BindingList<BO>();
  47.             list.AddingNew += new AddingNewEventHandler(list_AddingNew);
  48.             dataGridView1.DataSource = list;
  49.         }
  50.         void list_AddingNew(object sender, AddingNewEventArgs e)
  51.         {
  52.             e.NewObject = BO.CreateNew();
  53.         }
  54.         [STAThread]
  55.         static void Main()
  56.         {
  57.             Application.EnableVisualStyles();
  58.             Application.SetCompatibleTextRenderingDefault(false);
  59.             Application.Run(new Form1());
  60.         }
  61.     }
  62. }


 
Ensuite, à l'execution, avec la méthode à travers le proxy (la ligne décommentée actuellement)
j'ai créé une nouvelle ligne dans ma grille. Puis j'ai cliqué plusieurs fois alternativement de la ligne créé à la ligne avec l'étoile en début de ligne représentant une nouvelle ligne. Ca me jette une exception : System.InvalidOperationException
 
Si on construit directement l'objet métier sans créer de proxy, l'erreur ne se produit pas.
 
Quelqu'un aurait une explication ?
 
J'ai remarqué que le modèle d'objets métier du CSLA ( http://www.lhotka.net/ ) produit la même erreur, mais ne comporte pas de proxy.
 
Merci par avance pour vos éclaircissements !
 
Edit : pardon, oublié de préciser : c'est du .NET 2.0, je ne sais pas si c'est compatible avec le framework 1


Message édité par blackgoddess le 02-03-2007 à 00:47:08

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 02-03-2007 à 00:25:02   

Reply

Marsh Posté le 04-03-2007 à 17:16:00    

le message d'erreur de ton exception doit pouvoir t'en dire plus je suppose.
ça ressemble à l'accès de composant graphique dans un thread qui n'a pas créer/instancié ces composants graphiques (error de cross threading).
 
Peux tu nous donner ton messages d'erreur, car l'exception d'invalidoperationException est un peu vague.

Reply

Marsh Posté le 04-03-2007 à 18:59:45    

Depuis l'"immediate window" sur l'exception
 

Code :
  1. ?$exception
  2. {"Operation is not valid due to the current state of the object."}
  3.     [System.InvalidOperationException]: {"Operation is not valid due to the current state of the object."}
  4.     _className: Cannot fetch the value of field '_className' because information about the containing class is unavailable.
  5.     _data: Cannot fetch the value of field '_data' because information about the containing class is unavailable.
  6.     _dynamicMethods: Cannot fetch the value of field '_dynamicMethods' because information about the containing class is unavailable.
  7.     _exceptionMethod: Cannot fetch the value of field '_exceptionMethod' because information about the containing class is unavailable.
  8.     _exceptionMethodString: Cannot fetch the value of field '_exceptionMethodString' because information about the containing class is unavailable.
  9.     _helpURL: Cannot fetch the value of field '_helpURL' because information about the containing class is unavailable.
  10.     _HResult: Cannot fetch the value of field '_HResult' because information about the containing class is unavailable.
  11.     _innerException: Cannot fetch the value of field '_innerException' because information about the containing class is unavailable.
  12.     _message: Cannot fetch the value of field '_message' because information about the containing class is unavailable.
  13.     _remoteStackIndex: Cannot fetch the value of field '_remoteStackIndex' because information about the containing class is unavailable.
  14.     _remoteStackTraceString: Cannot fetch the value of field '_remoteStackTraceString' because information about the containing class is unavailable.
  15.     _source: Cannot fetch the value of field '_source' because information about the containing class is unavailable.
  16.     _stackTrace: Cannot fetch the value of field '_stackTrace' because information about the containing class is unavailable.
  17.     _stackTraceString: Cannot fetch the value of field '_stackTraceString' because information about the containing class is unavailable.
  18.     _xcode: Cannot fetch the value of field '_xcode' because information about the containing class is unavailable.
  19.     _xptrs: Cannot fetch the value of field '_xptrs' because information about the containing class is unavailable.
  20.     Data: {System.Collections.ListDictionaryInternal}
  21.     HelpLink: null
  22.     HResult: -2146233079
  23.     InnerException: null
  24.     IsTransient: false
  25.     Message: "Operation is not valid due to the current state of the object."
  26.     Source: "System.Windows.Forms"
  27.     StackTrace: " ... "
  28. System.Diagnostics.Debug.Write($exception.StackTrace)
  29.    at System.Windows.Forms.DataGridView.DataGridViewDataConnection.ProcessListChanged(ListChangedEventArgs e)
  30.    at System.Windows.Forms.DataGridView.DataGridViewDataConnection.currencyManager_ListChanged(Object sender, ListChangedEventArgs e)
  31.    at System.Windows.Forms.CurrencyManager.OnListChanged(ListChangedEventArgs e)
  32.    at System.Windows.Forms.CurrencyManager.List_ListChanged(Object sender, ListChangedEventArgs e)
  33.    at System.ComponentModel.BindingList`1.OnListChanged(ListChangedEventArgs e)
  34.    at System.ComponentModel.BindingList`1.InsertItem(Int32 index, T item)
  35.    at System.Collections.ObjectModel.Collection`1.Add(T item)
  36.    at System.ComponentModel.BindingList`1.AddNewCore()
  37.    at System.ComponentModel.BindingList`1.System.ComponentModel.IBindingList.AddNew()
  38.    at System.Windows.Forms.CurrencyManager.AddNew()
  39.    at System.Windows.Forms.DataGridView.DataGridViewDataConnection.AddNew()
  40.    at System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnNewRowNeeded()
  41.    at System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred)
  42.    at System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)
  43.    at System.Windows.Forms.DataGridView.OnCellMouseDown(HitTestInfo hti, Boolean isShiftDown, Boolean isControlDown)
  44.    at System.Windows.Forms.DataGridView.OnCellMouseDown(DataGridViewCellMouseEventArgs e)
  45.    at System.Windows.Forms.DataGridView.OnMouseDown(MouseEventArgs e)
  46.    at System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
  47.    at System.Windows.Forms.Control.WndProc(Message& m)
  48.    at System.Windows.Forms.DataGridView.WndProc(Message& m)
  49.    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
  50.    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
  51.    at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
  52.    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
  53.    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
  54.    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
  55.    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
  56.    at System.Windows.Forms.Application.Run(Form mainForm)
  57.    at TestDataGridSource.Form1.Main() in E:\Programmation\app.net\TestDataGridSource\TestDataGridSource\Form1.cs:line 70
  58.    at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
  59.    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
  60.    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
  61.    at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
  62.    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
  63.    at System.Threading.ThreadHelper.ThreadStart()
  64. Expression has been evaluated and has no value


Message édité par blackgoddess le 04-03-2007 à 19:00:33
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed