File: DataSourceHelper.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (76 lines) | stat: -rw-r--r-- 3,023 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//------------------------------------------------------------------------------
// <copyright file="DataSourceHelper.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------

namespace System.Web.UI {

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Data;

    internal sealed class DataSourceHelper {

        private DataSourceHelper() {
        }

        internal static IEnumerable GetResolvedDataSource(object dataSource, string dataMember) {
            if (dataSource == null)
                return null;

            IListSource listSource = dataSource as IListSource;
            if (listSource != null) {
                IList memberList = listSource.GetList();

                if (listSource.ContainsListCollection == false) {
                    // the returned list is itself the list we need to bind to
                    // NOTE: I am ignoring the DataMember parameter... ideally we might have
                    //       thrown an exception, but this would mess up design-time usage
                    //       where the user may change the data source from a DataSet to a
                    //       DataTable.
                    return (IEnumerable)memberList;
                }

                if ((memberList != null) && (memberList is ITypedList)) {
                    ITypedList typedMemberList = (ITypedList)memberList;

                    PropertyDescriptorCollection propDescs = typedMemberList.GetItemProperties(new PropertyDescriptor[0]);
                    if ((propDescs != null) && (propDescs.Count != 0)) {
                        PropertyDescriptor listProperty = null;

                        if (String.IsNullOrEmpty(dataMember)) {
                            listProperty = propDescs[0];
                        }
                        else {
                            listProperty = propDescs.Find(dataMember, true);
                        }

                        if (listProperty != null) {
                            object listRow = memberList[0];
                            object list = listProperty.GetValue(listRow);

                            if ((list != null) && (list is IEnumerable)) {
                                return (IEnumerable)list;
                            }
                        }

                        throw new HttpException(SR.GetString(SR.ListSource_Missing_DataMember, dataMember));
                    }
                    else {
                        throw new HttpException(SR.GetString(SR.ListSource_Without_DataMembers));
                    }
                }
            }

            if (dataSource is IEnumerable) {
                return (IEnumerable)dataSource;
            }

            return null;
        }
    }
}