Belső DataBinding

Belső DataBinding
2011-06-29T14:57:49+02:00
2011-06-30T14:29:13+02:00
2022-11-22T08:25:38+01:00
Hegistvan
Sziasztok!

A problémám a következő:

Egy txt fájlból olvasok be sok-sok mindent, aminek alapján egy bonyolult adatszerkezetem lesz sok listával, Dictionary-val stb. Ezeknek 90%-át kell kiraknom GUI-ra, hogy a user ellenőrizni tudja, hogy a program rendesen lefutott-e, esetleg átírni valamit "magyarabb" mondatokra, törölgetni, ilyesmi.

Gondoltam a kiíratással nem fogok sokat szenvedni, standard Controlokat felrakok, és azokba belekötögetem az értékeket. Ez szépen is megy, amíg primitív elemeket akarok bekötni.

A probléma akkor jelentkezik, amikor egy Lista elemeit akarom kirakni GUI-ra. Pl.: PasteBin kódrészlet

class InnerClass{ //Property-k public int ID{ get; set; }; public string Nev{ get; set; } public string KisCica{ get; set; }; //Constructor public InnerClass(int id, string nev, string cica){ ID = id; Nev = nev; KisCica = cica; } } class MyClass{ //Változó List<InnerClass> icList = new List<InnerClass>(); //Property-k public string Nev { get; set; }; public List<InnerClass> ICList{ get{return icList;} } //Constructor public MyClass(string nev){ Nev=nev; } } ... //Valahol a program elején: mc = new MyClass("Kovácsné"); mc.ICList.Add(new InnerClass(1,"Kitti","Foltos"); mc.ICList.Add(new InnerClass(2,"Jancsi","Pöttyös"); mc.ICList.Add(new InnerClass(3,"Zsolti","Csíkos");


Az ICLista feltöltése dinamikusan történik a programból. Amit tudok, hogy van az mc osztályom, de egyetlen InnerClass osztály sincs példányosítva futásidő előtt.
Ha DataBinding-al ki akarom íratni az mc.Nev property-t akárhova, azzal nincs semmi gondom, nagyon szépen működnek.

Amit szeretnék, hogy feltölteni egy ComboBoxot, vagy ListView-t, vagy akármit az mc osztály ICList elemeinek Nevével, egy másikat az ID-el, egy harmadikat a KisCicákkal stb.
Erre sehol sem találtam egyszerű megoldást, csak a tipikus favágós módszerek egyikét (OnChange esemény leprogramozása, foreach-es iterálás és feltöltés stb.)
A kérdésem az, hogy nyújt erre valami egyszerű megoldást a .NET, elsősorban a dataBindig-on belül, netán máshogy vagy kénytelen leszek fát vágni?

Előre is köszi a választ:
Hegi
Mutasd a teljes hozzászólást!

  • Helló,

    nem vagyok teljesen biztos abban, hogy ez a problémád, de saját osztályt tartalmazó listát pl így tudsz hozzárendelni egy comboboxhoz.

    combobox.DisplayMember = "Nev";
    combobox.ValueMember = "Id";
    combobox.DataSource = mc.ICList;
    Mutasd a teljes hozzászólást!
  • Kipróbáltam, amit mondtál, de az alábbi hibaüzenetet dobja:

    System.ArgumentException was unhandled
    Message=Cannot bind to the new display member.
    Parameter name: newDisplayMember
    Source=System.Windows.Forms
    ParamName=newDisplayMember
    StackTrace:
    at System.Windows.Forms.ListControl.SetDataConnection(Object newDataSource, BindingMemberInfo newDisplayMember, Boolean force)
    at System.Windows.Forms.ListControl.set_ValueMember(String value)
    at DataBinding.Form1.button2_Click(Object sender, EventArgs e) in D:\Dokumentumok\Visual Studio 2010\Projects\DataBinding\DataBinding\Form1.cs:line 31
    at System.Windows.Forms.Control.OnClick(EventArgs e)
    at System.Windows.Forms.Button.OnClick(EventArgs e)
    at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    at System.Windows.Forms.Control.WndProc(Message& m)
    at System.Windows.Forms.ButtonBase.WndProc(Message& m)
    at System.Windows.Forms.Button.WndProc(Message& m)
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    at System.Windows.Forms.Application.Run(Form mainForm)
    at DataBinding.Program.Main() in D:\Dokumentumok\Visual Studio 2010\Projects\DataBinding\DataBinding\Program.cs:line 18
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    at System.Threading.ThreadHelper.ThreadStart()
    InnerException:
    Mutasd a teljes hozzászólást!
  • DataGrid -et is használhatnál esetleg.

    http://www.switchonthecode.com/tutorials/csharp-tutorial-binding-a-datagridview-to-a-collection

    Hátha ez segít.
    Mutasd a teljes hozzászólást!
  • A DataGrid nem jó, mert ez a dolog most jelenleg úgy néz ki, hogy van egy root osztályom, annak van 3-4 primitív tulajdonsága, plusz egy lista.
    A második szinten lévő elemnek is van 3-4 primitív tulajdonsága, plusz 4 db Listája.
    Azokban a listákban lévő elemeknek is vannak listái, olyan 10-es nagyságrendben (5-8 megás text fájlokat nyálazok végig...), ráadásul ezek a listák 1másra mutogatnak...
    A célom az, hogy a guin meg tudjon valamilyen módon jelenni egyszerre mind a 10 listám. (Van olyan, aminek csak 1 eleme lesz, de olyan is van, aminek 10). Én magam is elvesznék a datagridben, nem hogy a user.
    Mutasd a teljes hozzászólást!
  • Ahogy jónak látod, de nem muszáj csak 1 et használni. Lehet a Main részre 1 aztán a SelectedItemnek a listája a következőben, vagy Listában...
    Mutasd a teljes hozzászólást!
  • Bocsi, de ez miként/miből született?

    ParamName=newDisplayMember
    Megmutatnád a kódrészletét?
    Mutasd a teljes hozzászólást!
  • A kódrészlet az, amiket már beírtam, plusz stego_ 3 sora. De itt egy link róla:
    Forráskód

    Annyi a különbség, hogy a formra felraktam 2 darab buttont, megy egy comboboxot, és csókolom.
    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