Building a CRM application using DevExpress XAF with Dave and Adam (Cross-Platform .NET App UI)

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hi Amanda here with DevExpress I'd like to introduce DevExpress MVPs and xaf veterans Dave Hesketh and Adam Lattimer in this video they'll build a CRM application from scratch using our Express app framework welcome to getting started with xaf I'm Dave Haskett and I'm joined here today with Adam Lattimer we are both 10 plus your veterans with xaf Alan will you tell us a little bit about xaf and who is designed for I'd love to Dave xaf is for developers who have a solid foundation in the.net framework you should be comfortable with C sharp or vb.net and general programming concepts it's intended to create small to medium enterprise applications which are about 1 to 100 users and it is not designed to create the next social media platform Dave how does X 1/2 compared to the other options yes so there's basically three scenarios that we see the first is to adopt a universal software product like Dynamics CRM yes you can take someone like Dynamics put it in place do a little bit of customization and hopefully it fit your needs in a lot of cases you're limited by that customization so you have to make the decision to create some custom software and your options there to either create custom software from scratch which is time-consuming and you have to do all the mundane work or you use a framework which take care of the mundane work for you so we've chosen ax AF is our framework as you can see in this architecture diagram xaf is split into two major layers they storage layer and the application layer the storage layer allows us to choose between - ORM tools entity framework or the Express persistent objects known as xpo xpo is actually a free ORM tool that is outperforming entity framework so we suggest that you use it xaf was also originally designed to work with xpo and the entity framework support was added later on within the storage layer there is some built-in Business Objects that you can use or extend as part of your this class library normally you will be creating your own business classes but the defaults are there if you choose to use them so in the application layer we have a few components the first is the UI which you can see at the top this can be a Windows forms asp.net webforms or mobile application below that we have our application controllers the built-in controller Library is what takes care of the normal mundane work things like generating the layout and creating all of you the actions that are needed to work with your business objects you will then create your own controllers that can interact with these existing controllers and actions or are completely independent finally the application model is shown on the right and all information used to generate the UI comes from the model the model is assembled from the metadata and then differents layers are applied to it to generate the final model well the model files are mainly XML files dem Express has created an easy to use model editor for quick customization of your application now we'll jump into Visual Studio and create a new xaf solution alright now that we're in Visual Studio we're gonna go ahead and create a new solution and xaf provides you with a solution wizard that we're gonna use do a starter CRM and so in the first page of the wizard here you've got the different platforms that are offered to you through xaf we're going to use just the windows and web on the next page here you choose your ORM so as we mentioned before the XPO objects are the ones that we recommend and it's what we're going to use in this example so in this page you can choose your security strategy and you can go with either none standard which is just a username and password or use your Active Directory windows account for this example that we're just going to use none on the last page here you can choose from all of the extra modules that xaf provides so you can see that there is you know clone object we're gonna use conditional appearance there's also file attachments Maps pivot grids but we're going to use these scheduler and validation as well and you can see for some of the modules that you select there's additional settings here on the right so we're gonna go ahead and click finish and it's going to create our solution for us alright so now that our solutions created you can see that xaf gives you a starter page here with links that new acts AF developers should definitely check out on the right-hand side you can see that it's created five projects for us so you got your dot win which is a standard windows form application your dot web which is a standard asp.net web form application your windows and web specific projects and then you also have a dot module which is your platform agnostic project that will be used in both your web and windows applications so we want to be doing most of our work in our dot module because that will go into both the web and win and we're going to start with just creating a new company object so I'm going to right click and do ad DevExpress item and then new item and this brings up the DevExpress template gallery so as you can see here you can create different types of business objects controllers and templates and so as we discussed before we're going to be using XPO and so we'll create a new one company and you can see when you create the the new object it leaves in a lot of comments that you can use that just help you get started but in our case we're just going to remove them to keep it a bit cleaner we're gonna go ahead and start adding a new properties here so you can see that we're using snippets that we've created and it just helps us input the properties quicker Dave do you want to go through what the format of the properties yes you'll notice that we use the snippets that we've created for ourselves and we've been doing these for a long time you can also check out the code rush shortcuts from dem Express if you have the code rush product installed there it also very extremely useful in terms of the frauds and profits that Adams actually creating here you'll notice that all the centers have this set property value method that's being called the background what that does is it it notifies the application that I changed them made to that property so it's actually using that I notifications interface to let the application know that hey something something has changed and you should enable things like the the safe save action it also tells other properties that they've been updated it's a key of logic that is conditional based on those they are updated as well exactly so now we've got our company here all I need to do is I'm gonna go into our dot win project open up the app config and just modify the connection string here and to point to my local database so with the use of XPO there are leaf 14 different database providers that are supported and it's as simple as changing that connection string to to start working with that database provider I believe some of them need a database driver potentially but other than that it is just a connection string change and you can also see the easy test connection string above it this is the testing framework that's built into xaf but it's outside of the scope of this session but it is something that you can check out if you're interested in it so I'm just going to go ahead and start the project and then it's going to take a little bit to start up for the first time during the first start up the the metadata is collected to generate that default model so that takes a little bit of time also our database is not being created in the background and this is the bonus of using an or M tool like xpo or entity framework you don't have to go and mainly those databases it's it's generating on a Mac in the background there is you know it's not a magic tool you do have to get in there and do a bit of database maintenance yourself so if you out a feel and then change the type you made to go back and then do that yourself if you're working with an existing database or if you're actually creating your business objects from an existing database you may have to to tweak the the database at that point as well all right so now that the applications loaded up you can see what just the default xaf lay it looks like so on the left here you've got your navigation items at the top you've got a ribbon similar to your Microsoft products and here what we're looking at is the list view of companies so we don't have any so I'm going to create one now now the view that this brings up is what's called a detailed view so it's the view of a single company okay and then I'll just use the save and close which will commit that object to the database close down the view and bring us back to the company list view so right now it's pretty dull we've just got the one company in here so we can go back into the code and add a new object for this yeah so maybe company contact would make the most sense at this point yeah so again we're doing new DevExpress item using the XPO business object so another thing that you can see that it automatically gives the default class options attribute to the class so this enables the object to be reportable so it will show up in the list of objects when you're creating a report it also allows it to be visible in the dashboards it creates a navigation item for it and it also allows the creatable item status and what that means is that regardless of what view you're on the drop down of the new action will contain this object now you'll notice when I was putting names in both from the business objects item and on the property side naming is really important so we suggest that when you're creating a business object you use a singular version of it so company versus companies and company contact then within your properties as you're creating your company's collection of contacts then you would use the plural version also you'll notice that the capitalization is important so when we're using things like ship to billing everywhere we want a space in our caption by default we want to put a new capital letters so it's gonna split it ship space to space billing xzf takes care of that automatically so you don't have to go and change all your captions everywhere you can update your captain's good if you want but it takes a lot of work out of it for you so now what we have is a company and a company contact object what we want to do is link those together so that a company contact will be a part of a company and a company has a list of company contacts so we're going to again use one of our snippets here I'm going to use the you're no link contacts so you can see here that we're using the XP collection which is the XP Oh implementation of a list and now that we've got the Association on one side we need to go over into the contacts I can do another association so in this case just one company call the company and you can see that both of the properties that I just created have the association attribute and xaf well know that based on the types that they're associated to each other so we'll go ahead and just run this again you can see the difference all right so again because of the default class options you can see that company contact now has its own navigation item with list view and if we actually open up our company you can see that xaf has automatically added the new contacts property to the list and based on the association it knows that this is a list of contacts this if i create a new one here all right so I'm just gonna add a second contact here as well you save and close and they just say the clothes for the whole company so you can see in the navigation that we have the scheduler event so this was put in here automatically because I added the scheduler module and we were first creating the solution and since we want to add a company and company contact to it we're just gonna extend the event class which is part of the default Business Library to do that we're just gonna create a new DevExpress I know that's instead of using base object so Dave do you want to tell me better about what the base object is yes so the base object is the xaf implementation of an XP or persistent object in reality you can use any of the XP of assistant class types as your base because meeting and basically all of the default objects that are part of that business class library already extend that base object word is layering on top of that by extending from event noticing that the event is not the same as a dotnet event it is just a business object called event right so what we have here we're just going to add a company and a primary contact but since we want to restrict the primary contact to a contact that actually exists on the company that we've selected we're going to use as a data source property and in this case you want to do the company contacts and so that's the list that we're going to allow them to select from another thing that we want to do here is add an attribute called the math and agents origins table so what this does is instead of creating a meeting table in SQL it's just gonna put everything into the event table normally if you didn't do this you would have an event and a meeting table and they would have the same who IDs for the same object which would allow them to join together properly we should say that the OID is part of that base object implementation it's the it's the key for the table it is a good normally in that base object it's a good if you're using a different base object type you can get an integer okay so before we actually get into the the new meeting type well is just create a separate company so we can have a separate list of contacts elderly demonstrate the datasource property attribute and the attributes that you apply to both business objects the holes of the glasses or their properties have a huge impact on the way the the application works we'll get more into that Shrugged a save added Bob into Google good alright so now we've got our meeting in the navigation panel over here and we can go ahead select a timeslot and right click for a new appointment now you can see that we've added our company and primary contact so if I pick DevExpress I can only select a contact from that company so Adam or Dave and if I switch over to Google it changes the data source of this list to only be Bob and Frank so you can see that this view has been created based on the event class but also the properties that we added to Harz and it could definitely look better so why don't we go into the model file and update this to look a bit cleaner so again these views are generated based on that meta data coming through from those persistent types the meeting and then our the event that we're extending from and so it does its best guess to to generate that and that layout but in reality you are expected to get in here and modify this layout so that they are customized look the way you want this is a very different concept from what most developers are used to where they're dragging and dropping controls onto forums and doing all their own data binding there's no need to do that because xaf does that for you right and you can see here that I've opened up the dot module model file so this means that any changes that I make here will be reflected in both the windows and web application and when you open this up you can see all the different nodes that are available to you so your Bo model which is going to be all of your business objects your navigation items if you want to change the order or add or delete some and then you also have your views which is where we're going to do the modification of that meeting view now right now all the business objects are grouped by their namespace you have the option to actually right click on that views node and say ungroup and it will be in alphabetical order sometimes it's a little easier to find things that way so now I'm just dragging and dropping these these properties wherever we want them to appear and the really cool part of this layout tool is that you can create tabs you can create separate groupings multi-column layouts it's really quite flexible I got a little pretty good and so while we're here as well I will go into the navigation items what I want to do is just remove that scheduler event item I'm just going to right click and delete it here so since we've implemented our own there's no need for both of them to show in the application all right so since we we had the meeting open last it's what's opened up again you can see that it's significantly cleaner than it was before there's a couple defaults actually that we haven't enabled so I'd like to see some icons in the tabs and also in the navigation so we can show you where to to add those in as well okay so for those items they're actually going to be dot Wynn specific so we'll come into the downtown project open up the model file and under navigation items you want to change this to show images true and under the options we want show tab image also set to true let's save that and start up the application so you can see that in the tabs at the top and in the navigation there's icons and so median already has a different icon because we're implementing the event object which already has its own icon but every one that you create by default will have the normal X AF logo and you can change that in the model file all right so let's go ahead and actually add an icon to our company contact so you could do that in the model file so it would be under the VL model and then company contact and over here you have the image name which by default is set to the vo underscore unknown but let's actually go right into the company contract at the top we can add an attribute called so attributes are an extremely powerful way to customize the application with them actually writing any new code essentially you know reinventing the wheel you you're utilizing the pieces that are there there's a ton of attributes you can use again they can live on the business object or live on the object properties so image name is a good one we talked with the default class options and all the pieces it does if you go back down to where we had done the contacts list in the company we have the Association attribute which basically links to object text together we also have that aggregated attribute which normally when you create an association you can actually link and unlink objects from other objects so you could click the link action and steal a contact from a different company the aggregated baek's it says no no this is my list of contacts you're not allowed to pick from that pool so that link and unlink action become unavailable and don't even show up so just try to open this up again so you can see now that our company contact does have that Bo lead image but I also wanted to show that on meeting our primary contact here and it's just using first name by default so what we want to do is actually set what's called the default property so that in this list it shows the full name instead of just the first name so on the company contact I had a new calculated property this object alright so we're gonna use some more attributes here so we're gonna do visible and detail the false and visible in list view false so as you've seen as we had properties into these objects when you open up a list view or a detail view they're automatically added in this case we don't want that so we're just gonna put them to two false in this attribute so these are attributes are always taken into consideration as part of that metadata to generate that face model this is a really good example of that when something like visible and list views defined on the property when it does that generation it takes that into consideration it doesn't include it so along the same line with the attributes there's also validation that we can add through attributes that's when we first created the solution we added the validation along with the conditional appearance module so on the company what I wanted to do is add the rule required field and also the rule value so what these attributes do the first one required fields make sure that you can't save a company unless you've filled in some value for company name and the rule unique value means that you can't have two companies that have the exact same company name so you can go ahead and run that so in the meeting you can see that now the contact is showing the full calculated name that we created and that was because you defined that default property attribute at the top exactly yeah and then now if we go over to our company list and I try to create a new one you'll see that right away it's got the asterisk beside the company name now which marks that it's required so if I try and save here your validation rule will pop up saying that the company name must not be empty in Google and save it we get a different validation error now saying that the company name values must be unique now these are two very straightforward validation examples you can have very complex examples where if one property is filled in you know that property also needs to be filled in you know the the level of complexity you can get is is infinitely complex it doesn't you're not limited by by a whole lot so so like I mentioned we also added the conditional appearance module so what we're going to do is create a conditional appearance rule that when we check off the ship to billing it just removes the shipping address from here because instead you just need to be using billing and we'll do another one that runs when your contact is active actually add that property in that it just builds the properties for it so again this could be done in the model file but we're just gonna use the attributes josho where it isn't the model file this is a good idea yeah let's do that so again we're going into the dock module what we want to do as much in the dock module as possible earlier and we opened up the dot win model file to change couple the image options but yeah I always make sure you're working at the kind of the lowest level you can so the platform agnostic or if you have to get into the windows or web specific because it's its platform dependent then go into those models but yeah I always try to do it in agnostic if you can explain how they static actually yeah it's a good point so the the model file again is is generated using that metadata to put those defaults together it's like if it's our base model that's actually compiled down into a little DLL assembly these model files are then layered on top so the changes you put in the dot the dot module are applied first so we take that that default model assembly we're layering on the the dot module model file those listed changes and those changes only and then depending on which platform are targeting whether it's dot wiener dog web we do the module dot win or module dot web model file on top of Matt's then the dot winter dot web product on top of that and then finally the last set of changes applied are actually the user changes so if the user decides to change column ordering or column sorting or mainly change the detail view at runtime those layers are then applied on top so it really is a difference model being stacked on top of each other right yeah so as we're talking about the appearance rules if we come into the BL model and find our object there's just a note here called appearance rules or I could add my own and set everything up through the model so since we're already here might as well do it so what we're gonna do is we're gonna make our criteria here we're gonna say we're shift a billing equals true and when that happens we want our target item of shipping we want the visibility of that property to be hidden so as long as that object you're on satisfies that criteria you can start applying those appearances back back color for color the font style whether or not it's a native old or what you hide it all together so another attribute that we want to add that will work with that is the medium post data so normally when you change a property value it doesn't actually take effect until that property editor loses focus so if you were typing in a name when you click tab to go to the next the next field that's not a detergent happen what the immediate post-dated does is it actually watches for the control value change so when the control is actually affected at the UI levels as soon as you click there it instantly takes effect whereas if we didn't have the immediate post data you could check that off you would have to click on something else first before that one away and you can see since I already had it set on the Google company and it's already removed as soon as we load it up yeah so now we're just gonna do our second one we'll show you that by doing it in the company contact as an attribute you'll see here because the appearance attribute is specific to that conditional pairs module we have to resolve in but now we can define all the attributes of one of this attribute that's not confusing we can assign all the values of that attribute right here in the class itself we like this because when you want to figure out what's happening with this object you know something seems to be behaving misbehaving whatever reason it's one place to go and look for all the pieces are affecting this so in this case our criteria is just we're active equals true for the target items we're gonna do everything and what we're gonna do in this case was change the font style we're gonna make everything bold now by default this appearance actually will work in both lists and utilities you do have the option to target to one of the other or even custom contacts all right so I can open up my company contact here you can say that Frank is active when you select active it makes all the properties bold as Dave mentioned it's not specific to the detail or the list view you can see that it happens in both let me save that again it happens on our full company contact list as well so what happens if you create a new contact right now so the active isn't actually enabled right so how do we accept the enabled so what we're going to do is go into our company contact class and in the after construction this is what runs when you first create an object when we run it again now when we create a contact so the after construction is only when it's created the first time not every time it loads that's correct yeah yeah so once we start typing it will be bold as well so just using attributes we've managed to completely customize the way the application works using that underlying functionality there's no there's no need to reinvent the wheel do a lot of this stuff but now we might get into a point where we actually want to do something fully custom so to do that we can actually create our own controllers in our own actions so why don't we do something like create a meeting directly from the company as a separate action and so for this we're going to create a new controller now again the controllers can be either platform-specific or they can be platform agnostic so if we can make the controller platform agnostic we absolutely will now you notice that the controller name that I was put in here is quite long there's nothing wrong using long names as laws or descriptive okay so now that our controllers been created by default it opens up to the design view and from the toolbox on the Left we want to have action and you can see that there's four kinds in here so the simple action is just a button your single choice action allows you to pick an item from a drop-down your parameterised action allows you to enter some data and submit it and the pop-up window show action will show a view and a pop-up dialog with ok and cancel buttons so in our case that's what we want and down in the bottom right hand corner we're going to set some of the properties here so our name and ID here is gonna be actually create meeting and we'll just set our caption as well just say meaning so we always start our action names with the word action simply so that when we go and try to find me actually that we've created say in the model file they're all listed at the top for the Commission name we're gonna use another one that's included and then actually a framework which is just the PIO underscore scheduler this is actually the same icon that our meetings using and then for the event we want to use the customize pop-up window brands okay so now we've just scope this controller down to our company we can have a look at the pieces behind the controller too soon we have access to so the grandpa listed properties the four major ones we want to deal with are the application so that gives us access to all the kind of fundamental pieces that build this application this is the wind farms the web forms we don't really care as an IAC's AF application we then have the frame and the frame is what we consider kind of the glue it's where the view lives it's where the template that shows the view lives through all the controllers become accessible so if we wanted to access some different controllers we do that through the frame we then have the object space and so in object space is basically your your connection to the database essentially your entire transaction your entire lifespan of this this view and these objects live within that object space and every view has to have its own object space that being said if you're showing a nested view so a view the block to another view you can use a what's called a nested object space and we're going to use that here as well and the last piece of course is the view itself that's the last major one so the view is the view we're currently looking at that view has a current object which in this case be in the detail view we know company so the first thing we're going to do here we're going to try to show a meeting detailed views we're gonna grab the company that we want to associate to that meeting we're simply grabbing the view current object and casting it as a company if we didn't scope this controller down that line I was in favor flat scoping is really important so next we're going to create that object space we're going to use a nested object based based on the current the track controllers object space we can do that through the view tonic space or just objects basically the nice thing we're doing is creating our meeting object we want to do that in the new objects place one of the very important rules of an object space is that they're not allowed to mix so you're not allowed to use objects from a different object space in your object space you have to pass that object space through first so you're gonna see here we've created that meeting and a new object space now the rest of the meeting company to the company that part of the current view in order to do that we have to pass it through using that get object so we're saying hey new object space go and get the object of company here's the company on when you go get in the background it does its little query magic and pulls in that that company for us and the last thing we want to do is tell the parameters of this this action hey this is the view we want to create and so the e-dot view we're gonna assign by asking the application to create a detail before us for doing the application or a detail view we're passing the object space and we're passing the object we want to actually show and that should be enough we should be able to run this and have our action work and because we did the public window show action it's going to pop up in that pop-up window by default with that okay in cancel button alright so you can see now that we're on a detailed view of our company that create meeting button is in our ribbon and we click on that just like Dave said it pops up in this new view with the company set so I'll just accept that okay you can see now that the Save button is activated so this is because we use that nested object space so I could still cancel right now and it would delete that meeting or never actually commit it to the database but in this case we'll just save it okay so now let's create a controller that works with a specific view like the detail view directly so the one that we're gonna create will actually be Windows specific I'm going to do it in the dot module dot win project and instead of using the template gallery I'm just gonna go ahead and show you how you can create it just from a class so here and so the idea behind this is to highlight the URL and little company right so it will highlight the URL so that it's blue underlined and then if you double click on that control it'll open up the website for you so this is actually access in the control directly on the detail view that's correct in okay so what happened here so what I'm using is a view controller but using the generic implementation of it so that it knows that it's a detail view so I don't need to scope it down to a detail view this is just another way of doing that so if you normally could be a list view a detailed view a dashboard view orthogonals that's correct so in the constructor I'm going to scrub it down to the object type company and since we're working with the controller directly we want to do the override and in here we're gonna get a straining pop of the editor gonna be the website do that because we've already scoped it down so view now in this case as you can see here is always gonna be a detailed view and that's because of this generic implementation of it now there's also another generic implementation where we can say as an object II controller and specify the view type and the object type of imaginary definition so now that we have the editor we want to see if the website editor control will actually do that as well to check for the editor itself and so the control here you can see is a text edit and what we're going to do is just change the font and set the floor color to be blue so the other thing that we need to do is handle the controls sorry I subscribe to the controls double bit and then so we know that the sender is in view text edit the extra editors diagnostics just past the edit text and so since we subscribe to this event we want to make sure that we unsubscribe from it this is a very common thing that we see a lot of people will subscribe to events but always forget to unsubscribe and that can lead to huge memory leaks on a bigger scale so here we want to make this a classroom so essentially during the garbage collection if we try to if we try to dispose of something that already are still being held through another reference it's not going to disclose properly so that's why that subscription okay and so now you can see that the website has been colored blue and underlined anybody go ahead and double click on it it will open up the DevExpress website here alright so there's one more controller that we wanted to show and this one we're going to bold the column headers of all of the list views so it will work for the nested list views here and also for the list views okay so we're gonna create another controller we'll do the same thing rather than use the template gallery we'll just create another class so in this case we're going to scale it down or scope it down to a list view only rather the detail view and the list views have an editor property and that's really the the editor that displays the controls so whether it be a grid control or the scheduler control those are all done by different editors and because we're not doing this on a particular object type we're just setting a less view and it's gonna run every ListView so again we want to access when the grid view controls are created so we're you know we're gonna hope that the the editor exists and that the control of the Crayola we have which it should at this point there are scenarios primarily on the detailed view side of things where you're expecting the on the beautiful created that every control is created with every property editor that's not actually the case there is a little bit of lazy loading that does happen on the ListView side though with the control has been activated and they have you controlled creative development no waves right it should have you should have the other rate of go for this this is what happened here we've grabbed that grid list editor or we're assuming that's the type word we're working with but it could be schedule editor or some different type of list editor so we do it through that valchek and then we're going in and accessing the underlying people of that editor it should be our grid view and we're going to set that font property to be boys and because we're not subscribing to any events in this case we don't we don't need the deactivated yeah so it's it's pretty subtle but you can tell that the column headers now are bold yeah so I think that is it as far as our controllers and the window side of things go let's actually open up the web application as well so do that we're just going to go into the dot web and update the web config to point to the same database and we want to also right-click the dot web and set that as our starter project so even though we haven't done anything web specific I still see that everything that we did in the dot module project is brought forward into this application so it looks extremely similar to be the Windows version I can't want to come to this view we can go into the edit mode and see the detail view that immediate post data attribute that we put on top of that ship to billing does force a little post back and that recreates our view for us with that cognition appearance rule the nested list of contacts all that works the same same thing the object spaces but there's a new topic space for nested object space if you head over the meaning list 0.8 that we also have the create meeting button up here and it slides up that view instead of popping it up and so it's still nested within that and then your primary contact should still be filtered as well yeah what happens if you go and change that company now so this is occurring because we didn't put the immediate post data on on that company property so more importantly on the way like I said if you like the window sight accommodated for pretty well but on the website that immediate posting is and isn't specified it's not going to do that callback so one thing that we haven't mentioned we haven't been worrying about the database at all so why don't we open up the SQL management studio and just take a look at what we've created here let's go into the database and check out the company contact table so under columns we have our primary key which is a unique identifier and then we've got all of the other properties that we added so you can see that our string properties have a character limit of 100 but you can also add an attribute to to change that to increase the size or decrease it to whatever you'd like then we have our XPO specific fields which are optimistic lock and the GC record so the optimistic lock is just used by the locking Maxon mechanism in xpo and the GC record is used instead of deleting records out of the database completely it'll just set a value to this GC record field and then it won't be brought into any of the queries you can also see that under keys and indexes these are created for us as well good you also see the XP object type table down below and so this is XPO specific essentially when you have multiple classes that inherit from the same base so in our case we did event in the meeting this table describes the the object type that's being used on the UI side so when we go and open up a meeting even though we don't have a meeting table our event table will have a column called object type which will reference its ID and so if I had multiple different types inheriting from event it would know to go and pull either from the meeting table or a different type of event table we've looked at okay so that's basically it for the database side of things we didn't have to think about it too much which is great it's important to realize that the applications that we've created are just standard windows and web vacations and dotnet so anything you can typically do in those types of applications you can also do in annex a F based application as well there are preferred ways to do things with xaf so in terms of creating different views of different editors you know creating a property editor or creating a list editor usually it's an easier way to still use the existing features of xaf what like making your own custom changes in terms of getting help on kind of getting started the next pieces i've certainly hit up the DevExpress website ahead of that support section and search the knowledgebase articles there's a beautiful forum here you can also create your own tickets and the DevExpress support team is amazing at getting back to you with with insightful answers if you find that they search for articles is not as robust as you would hope for a certain head over to Google and enter your site : deborah stress comm and then do your search and you'll be a little more familiar in terms of getting back your Google web results we we typically stick to this ourselves so so also with the xaf community they are a very tight-knit group of people there are lots of community resources out there and people who can help you out so certainly get involved in that as much as you can head over the social media sites there are LinkedIn and Facebook and Twitter groups so you can you can follow along with as well and really keep up to date with what's going on that's it for this session thanks for joining us thanks Dave and Adam if you'd like to learn more about xaf you can watch more videos from our playlist or check out the documentation on our website don't forget to subscribe and ring the bell to get notified whenever we release new content thanks for watching and thank you for choosing DevExpress
Info
Channel: DevExpress
Views: 26,154
Rating: 4.8961039 out of 5
Keywords: Developer Express, DevExpress, XAF, eXpressApp Framework, CRM, CRM app, WinForms, ASP.NET
Id: SCPho8CgalY
Channel Id: undefined
Length: 53min 56sec (3236 seconds)
Published: Fri Feb 08 2019
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.