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

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.

本文主要讲述第二部分,即User Control的用法

需求背景:

如果想把列Pass Rate由现在的单纯的数字表示转换成进度条显示,该怎么办?

飞信截屏未命名2 

====>

飞信截屏未命名3

这个进度条可以通过创建一个Web User Control来实现。

1. 首先给项目增加一个Web User Control 文件 PassRateProgressBar.ascx

  

2. 在PassRateProgressBar.aspx中增加下面代码,

   因为需要根据数值的不同调整进度条的绘制,因此div的style需要动态设定,所以需要在code behind的文件中实现相应的方法。

   1: <div>
   2:     <table>
   3:     <tr>
   4:       <td style="border-0">
   5:         <div style="<%=GetContainerStyle()%>">
   6:             <div style="<%=GetPrograssStyle()%>"></div>
   7:         </div>
   8:       </td>
   9:       <td style="border-0"><span><%=Percentage%></span></td>
  10:     </tr>
  11:     </table>
  12: </div>

3. 对应的PassRateProgressBar.aspx.cs文件中相关代码如下,

   1: public string Width { get; set; }
   2:  
   3: public string Height { get; set; }
   4:  
   5: public string Percentage { get; set; }
   6:  
   7: public string GetContainerStyle()
   8: {
   9:     if (string.IsNullOrEmpty(Width))
  10:     {
  11:         Width = "100px";
  12:     }
  13:  
  14:     return string.Format("border:solid 1px #b4b4b4; text-align:left; {0}", Width);
  15: }
  16:  
  17: public string GetPrograssStyle()
  18: {
  19:     if (string.IsNullOrEmpty(Percentage))
  20:     {
  21:         Percentage = "0";
  22:     }
  23:  
  24:     if (string.IsNullOrEmpty(Width))
  25:     {
  26:         Width = "100px";
  27:     }
  28:  
  29:     if (string.IsNullOrEmpty(Height))
  30:     {
  31:         Height = "20px";
  32:     }
  33:  
  34:     string aStyle = string.Format("background-color:Green; height:{0};", Height);
  35:     try
  36:     {
  37:         int aWidth = int.Parse(Width.Substring(0, Width.Length - 2));
  38:         double aPercent = double.Parse(Percentage.TrimEnd(' ', '%'));
  39:         double aProgWidth = (aPercent * aWidth) / 100;
  40:         aProgWidth = aProgWidth < 0 ? 0 : aProgWidth;
  41:         aProgWidth = aProgWidth > aWidth ? aWidth : aProgWidth;
  42:  
  43:         return string.Format("{0} {1}px", aStyle, aProgWidth);
  44:     }
  45:     catch
  46:     {
  47:         return aStyle;
  48:     }
  49: }

4. 把这个自定义的控件加入到default.aspx 页面中,首先需要在default.aspx页面中注册这个控件,然后才可以用

   <%@ Register Src="~/PassRateProgressBar.ascx" TagPrefix="local" TagName="ProgressBar"%>

5.  把原来的Pass Rate列改成用这个自定义的控件来代替

<td>

<local:ProgressBar runat="server" Width="80px" Height="15px" Percentage='<%# Eval("PassRate") %>'/>

</td>

  因为这个也是服务器端控件,需要加上 runat="server" 

  在step 4中,设置了这个空间的TagPrefix和TagName,所以这里面可以像用其他标准ASP.NET Server Control那样来使用这个自定义的control.

至此,开篇提到的需求基本满足了,但是这个自定义控件还有一个问题没有解决,就是状态保存问题。这个问题在下一篇中解决。

-- To Be Continued --

原文地址:https://www.cnblogs.com/fangwenyu/p/1589422.html