1 // 2 // System.Web.Util.DataSourceResolver 3 // 4 // Authors: 5 // Ben Maurer (bmaurer@novell.com) 6 // 7 // (C) 2005 Novell, Inc (http://www.novell.com) 8 // 9 // Permission is hereby granted, free of charge, to any person obtaining 10 // a copy of this software and associated documentation files (the 11 // "Software"), to deal in the Software without restriction, including 12 // without limitation the rights to use, copy, modify, merge, publish, 13 // distribute, sublicense, and/or sell copies of the Software, and to 14 // permit persons to whom the Software is furnished to do so, subject to 15 // the following conditions: 16 // 17 // The above copyright notice and this permission notice shall be 18 // included in all copies or substantial portions of the Software. 19 // 20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 // 28 29 // 30 // This is from 31 // _Developing Microsoft ASP.NET Server Controls and Components_ (Kothari, Datye) 32 // Listing 20-3 "GetDataSource" (page 564) 33 // 34 35 using System.Collections; 36 using System.ComponentModel; 37 38 namespace System.Web.Util { 39 class DataSourceResolver 40 { DataSourceResolver()41 DataSourceResolver () {} 42 ResolveDataSource(object o, string data_member)43 public static IEnumerable ResolveDataSource (object o, string data_member) 44 { 45 IEnumerable ds; 46 47 ds = o as IEnumerable; 48 if (ds != null) 49 return ds; 50 51 IListSource ls = o as IListSource; 52 53 if (ls == null) 54 return null; 55 56 IList member_list = ls.GetList (); 57 if (! ls.ContainsListCollection) 58 return member_list; 59 60 ITypedList tl = member_list as ITypedList; 61 if (tl == null) 62 return null; 63 64 PropertyDescriptorCollection pd = tl.GetItemProperties (new PropertyDescriptor [0]); 65 66 if (pd == null || pd.Count == 0) 67 throw new HttpException ("The selected data source did not contain any data members to bind to"); 68 69 PropertyDescriptor member_desc = data_member == "" ? 70 pd [0] : 71 pd.Find (data_member, true); 72 73 if (member_desc != null) 74 ds = member_desc.GetValue (member_list [0]) as IEnumerable; 75 76 if (ds == null) 77 throw new HttpException ("A list corresponding to the selected DataMember was not found"); 78 79 return ds; 80 } 81 } 82 } 83