Abstract:

通过一个简单的 web application, 学习以下内容:

(1) ListView control

(2) User control

(3) Handle ViewState in User control

(4) FindControl() usage, especially when there is a Master page.

本文主要讲述第一部分,即如何使用ListView控件。

虽然GridView功能非常强大,但是有时候用GridView却不是非常方便。比如说要实现下面这个页面,

【原创】ASP.NET 学习(1)

数据结构是分层次,第一层次是student的基本信息,第二层是该student的每门课的分数。对于这种分层次的数据结构,如果用GridView来做数据绑定控件,是很不直观的。因为GridView非常适合扁平的数据结构,如果用GridView来显示的话,需要把已有的数据结构做“扁平化”处理。而用ListView会很直观,不需要做这些处理。

简单起见,数据源采用ObjectDataSource,首先定义下相关的Model和Controller,代码如下: 

StudentModel

class StudentModel
   2: {
int ID { get; set; }
   4:  
string Name { get; set; }
   6:  
string PassRate
   8:     {
   9:         get
  10:         {
  11:         
null)
  13:             {
float aCoursePassed = 0;
  15:  
this.CourseScoreList)
  17:                 {
if (aCourse.CourseScore >= 60)
  19:                     {
  20:                         aCoursePassed++;
  21:                     }
  22:                 }
  23:  
this.CourseScoreList.Count);
  25:                        
  26:             }
  27:  
;
  29:         }
  30:     }
  31:  
  32:  
public IList<CourseScoreModel> CourseScoreList
  34:     {
  35:         get;
  36:         set;
  37:     }
  38:  
  39: }
  40:  
class CourseScoreModel
  42: {
string CourseName { get; set; }
  44:  
double CourseScore { get; set; }
  46:  
  47: }

StudentController

class StudentController
   2: {
   3:     
private IList<StudentModel> GetStudentsNoSort()
   5:     {
new List<StudentModel>();
   7:  
new StudentModel
   9:         {
  10:             ID = 101,
,
  12:         };
  13:  
new List<CourseScoreModel>();
  15:  
new CourseScoreModel
  17:         {
,
  19:             CourseScore = 67
  20:         };
  21:         aCourseList.Add(aCourseScoreModel);
  22:  
new CourseScoreModel
  24:         {
,
  26:             CourseScore = 45
  27:         };
  28:         aCourseList.Add(aCourseScoreModel);
  29:  
new List<CourseScoreModel>(aCourseList);
  31:         aStudentList.Add(aStudentModel);
  32:  
new StudentModel
  34:         {
  35:             ID = 102,
,
new List<CourseScoreModel>(aCourseList),
  38:         };
  39:  
  40:         aStudentList.Add(aStudentModel);
  41:  
return aStudentList;
  43:     }
  44:  
  45:  
public IList<StudentModel> GetStudents(String SortExpression)
  47:     {
  48:  
  49:         IList<StudentModel> aStudentList = GetStudentsNoSort();
  50:  
string.IsNullOrEmpty(SortExpression))
  52:         {
return aStudentList;
  54:         }
  55:  
' ');
  57:  
typeof(StudentModel).GetProperty(aSortExpressionArray[0]);
  59:  
if (aSortExpressionArray.Length == 1)
  61:         {
// Asscending Sort
as List<StudentModel>).Sort
  64:                 (
null).ToString(),
null).ToString())
  67:                 );
  68:         }
else
  70:         {
// Descending Sort(aStudentList as List<StudentModel>).Sort
as List<StudentModel>).Sort
  73:                 (
null).ToString(),
null).ToString())
  76:                 );
  77:         }
  78:  
return aStudentList;
  80:     }
  81: }

数据结构定义好之后,就可以进行页面的编码了。 因为数据结构是两个层次,因此需要用到两层ListView,分别对应Student信息和相应的课程分数信息。

用ListView需要首先定义下它的LayoutTemplate,

>
>
>
>
>
>
>
>
>
>
>
>

不想GridView,我们需要自己来定义整个Table结构,因为对每一行来说都是每个Student信息,因此把每一行单独放到到一个placeholder 里面,注意这一句

  

<tr id="itemPlaceHolder" runat="server"></tr>     runat="server" 是必须的, 而且id为itemPlaceHolder

接下来定义这个PlaceHolder的内容,
 
 
>
>
) 
%></td>
) 
%></td>
) 
%></td>
>
>
>
   9:  
>
>
/>
>
>
>
>
>
>
) 
%></td>
) 
%></td>
>
>
>
  24:  
>

  

还需要定义一个ObjectDataSource指向之前定义的数据对象,

 
 
>
>
/>
>
>

最后要注意一下,这里面关于对列Name排序的处理。

因为ListView不像GridView自动支持排序功能,当用鼠标点击表头的响应列,这列的数据会自动进行排序。想让ListView也有这种效果,需要自己编程来实现。

(1)  首先在Table中把列Name的表头控件设置成LinkButton,如下

<td><asp:LinkButton ID="SortByNameLinkButton" runat="server" CommandName="Sort" CommandArgument="Name">
       Name
     </asp:LinkButton>
</td>
                  

特别注意,这里面两个参数CommandName和CommandArgument的设置,CommandName必须设置成“Sort”,CommandArgument设置成该列对应数据源的字段名,此例中为”Name”.

(2)  在ObjectDataSource中设置属性SortParameterName,该属性的值与SelectMethod对应的方法的参数名一致,此例为"SortExpression”。

(3)  在SelectMethod中进行处理,如下所示:

           if (string.IsNullOrEmpty(SortExpression))
            {
                return aStudentList;
            }

            String[] aSortExpressionArray = SortExpression.Split(' ');

            PropertyInfo aPI = typeof(StudentModel).GetProperty(aSortExpressionArray[0]);

            if (aSortExpressionArray.Length == 1)
            {
                // Asscending Sort
                (aStudentList as List<StudentModel>).Sort
                    (
                        (sm1, sm2) => string.Compare(aPI.GetValue(sm1, null).ToString(),
                            aPI.GetValue(sm2, null).ToString())
                    );
            }
            else
            {
                // Descending Sort
                 (aStudentList as List<StudentModel>).Sort
                    (
                        (sm1, sm2) => string.Compare(aPI.GetValue(sm2, null).ToString(),
                            aPI.GetValue(sm1, null).ToString())
                    );
            }

       当页面第一次Load的时候,参数SortExpression为空字符串,因此需要首先判断一下参数是否为Empty,如果是则直接返回,不作排序处理。SortExpression的值包含两部分,第一部分是需要排序的字段,第二部分是排序方向 (特别注意,如果是升序排序,则这部分为NULL, 否则为字符串”DESC”. 因此需要对这个参数进行相应处理。

总结:

(1) ListView的优势--层次数据结构

(2) 自定义排序需要注意的地方

-- To Be Continued--

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-12-10
  • 2021-06-03
  • 2021-11-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-17
猜你喜欢
  • 2021-10-08
  • 2021-11-23
  • 2021-11-20
  • 2022-02-21
  • 2022-12-23
  • 2021-10-10
  • 2021-11-01
相关资源
相似解决方案