DataList控件

DataList控件

selfcherish

2008-11-20

 

DataList控件,作为更GridView,Reapter等类似的数据展示控件,无外乎是要实现它们和数据源的绑定,实现修改、删除、更新的功能等。分别来看。

 

一、使用SqlDataSource为DataList控件绑定数据源

    这个比较简单,拖动控件到web窗体上,然后设定其DataSource为哪个SqlDataSource控件的数据就可以了。为了展示的数据好看,可以编辑DataList的Header模板和Footer模板,并为其选定一种样式,设定控件的 RepeatDirection为"Horizontal",RepeatColumns为"5"。由于是使用SqlDataSource控件作为它的数据源,其ItemTemplate模板会自动被编辑,加上相应的数据源字段的绑定。最后代码如下:

  1. "DataList1" runat="server" BackColor="White" 
  2.             BorderColor="#E7E7FF" BorderStyle="None" BorderWidth="1px" CellPadding="3" 
  3.             DataKeyField="ID" DataSourceID="SqlDataSource1" GridLines="Horizontal" 
  4.             RepeatColumns="5" RepeatDirection="Horizontal">
  5.             "#B5C7DE" ForeColor="#4A3C8C" />
  6.             "#F7F7F7" />
  7.             "#E7E7FF" ForeColor="#4A3C8C" />
  8.             "#62788A" Font-Bold="True" ForeColor="#F7F7F7" />
  9.             
  10.                 演示一:控件数据源
  11.             
  12.             "#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />
  13.             
  14.                 控件数据源
  15.             
  16.             
  17.                 ID:
  18.                 "IDLabel" runat="server" Text='<%# Eval("ID") %>' />
  19.                 
  20.                 sname:
  21.                 "snameLabel" runat="server" Text='<%# Eval("sname") %>' />
  22.                 
  23.                 english:
  24.                 "englishLabel" runat="server" Text='<%# Eval("english") %>' />
  25.                 
  26.                 distrubute:
  27.                 "distrubuteLabel" runat="server" 
  28.                     Text='<%# Eval("distrubute") %>' />
  29.                 
  30.                 finalpoint:
  31.                 "finalpointLabel" runat="server" 
  32.                     Text='<%# Eval("finalpoint") %>' />
  33.                 
  34.                 sbool:
  35.                 "sboolLabel" runat="server" Text='<%# Eval("sbool") %>' />
  36.                 
  37.                 
  38.             
  39.         
  40. "SqlDataSource1" runat="server" 
  41.             ConnectionString="<%$ ConnectionStrings:DbOneConnectionString %>" 
  42.             SelectCommand="SELECT TOP (10) ID, sname, english, distrubute, finalpoint, sbool FROM sscore_OLD_local">
  43.         

二、使用自定义数据源

        使用自定义数据源的时候,不需要在智能标签里边设置其DataSource属性,这需要通过编程来设定,也就是在程序中返回一个DataTable,赋值给DataList的DataSource成员,然后调用其DataBind方法绑定数据。需要注意的是,这个时候,ItemTemplate模板下的数据绑定就需要手动去写了。写的方法,就是在智能标签中选择编辑模板,然后选族ItemTemplate,为需要绑定的字段取名,并添加相应的控件来呈现字段的实际数据,一般不需要编辑的时候都用Label。如图:

 

DataList控件_第1张图片

然后,在选IDLabel控件的智能标签,并编辑绑定(Edit DataBindings...):

 

DataList控件_第2张图片

 

整个控件的代码如下:

  1. "DataList2" runat="server" BackColor="White" 
  2.             BorderColor="#999999" BorderStyle="None" BorderWidth="1px" CellPadding="3" 
  3.             GridLines="Vertical" RepeatColumns="5" RepeatDirection="Horizontal">
  4.             "#CCCCCC" ForeColor="Black" />
  5.             "#DCDCDC" />
  6.             "#EEEEEE" ForeColor="Black" />
  7.             "#008A8C" Font-Bold="True" ForeColor="White" />
  8.             
  9.                 演示二:自定义数据源
  10.             
  11.             "#000084" Font-Bold="True" ForeColor="White" />
  12.             
  13.                 自定义数据源
  14.             
  15.             
  16.                 ID:
  17.                 "IDLabel" runat="server" Text='<%# Eval("ID") %>' />
  18.                 
  19.                 sname:
  20.                 "snameLabel" runat="server" Text='<%# Eval("sname") %>' />
  21.                 
  22.                 english:
  23.                 "englishLabel" runat="server" Text='<%# Eval("english") %>' />
  24.                 
  25.                 distrubute:
  26.                 "distrubuteLabel" runat="server" 
  27.                     Text='<%# Eval("distrubute") %>' />
  28.                 
  29.                 finalpoint:
  30.                 "finalpointLabel" runat="server" 
  31.                     Text='<%# Eval("finalpoint") %>' />
  32.                 
  33.                 sbool:
  34.                 "sboolLabel" runat="server" Text='<%# Eval("sbool") %>' />
  35.                 
  36.                 
  37.             
  38.         

 

数据绑定的代码如下:

  1.         protected void Page_Load(object sender, EventArgs e)
  2.         {
  3.             if(!IsPostBack)
  4.             {
  5.                 db sdb = new db();
  6.                 DataList2.DataSource = sdb.dt("SELECT top 10 [ID], [sname], [english], [distrubute], [finalpoint], [sbool] FROM [sscore_OLD_local] ORDER BY [ID]");
  7.                 DataList2.DataBind();
  8.             }
  9.         }

 

db类的定义在后边给出。

 

三、实现DataList控件的编辑、更新、和删除

        要实现DataList控件的编辑、更新、和删除,除了要在ItemTemplate和EditTemplate中实现其数据绑定之外,还需要在这两个模板中添加Button或LinkButton或HyperLink,并设定它们的CommandName分别为edit、update、delete或cancel,根据这几个CommandName,然后利用DataList的EditCommand、UpdateCommand、DeleteCommand、CancelCommand等事件来实现相应的操作。在EditTemplated模板中的数据展示控件就相应的需要用可以供编辑的控件如TextBox了。最后,还需要设定DataList的DataKeyField属性,作为其编辑、删除和更新的主键。如图:

 

DataList控件_第3张图片

修改和删除的CommandName分别就设置为edit和delete。

 

DataList控件_第4张图片

更新和取消的CommandName分别设置为update和cancel。

完成后,DataList的代码如下:

  1. "DataList3" runat="server" CellPadding="4" ForeColor="#333333" 
  2.             oncancelcommand="DataList3_CancelCommand" 
  3.             ondeletecommand="DataList3_DeleteCommand" oneditcommand="DataList3_EditCommand" 
  4.             onupdatecommand="DataList3_UpdateCommand" RepeatColumns="5" 
  5.             RepeatDirection="Horizontal">
  6.             "#507CD1" Font-Bold="True" ForeColor="White" />
  7.             "White" />
  8.             "#EFF3FB" />
  9.             
  10.                 id:"Label1" runat="server" Text='<%# Eval("id") %>'>
  11.                 
  12.                 sname:"TextBox1" runat="server" Text='<%# Eval("sname") %>'>
  13.                 
  14.                 english:
  15.                 "TextBox2" runat="server" Text='<%# Eval("english") %>'>
  16.                 
  17.                 distrubute:"TextBox3" runat="server" 
  18.                     Text='<%# Eval("distrubute") %>'>
  19.                 
  20.                  finalpoint:"TextBox4" runat="server" 
  21.                     Text='<%# Eval("finalpoint") %>'>
  22.                 
  23.                 "LinkButton3" runat="server" CommandName="update">更新
  24.                  
  25.                 "LinkButton4" runat="server" CommandName="cancel">取消
  26.             
  27.             "#D1DDF1" Font-Bold="True" ForeColor="#333333" />
  28.             
  29.                 演示三:实现自定义数据源的修改和删除
  30.             
  31.             "#507CD1" Font-Bold="True" ForeColor="White" />
  32.             
  33.                 实现自定义数据源的修改和删除
  34.             
  35.             
  36.             ID:"IDLabel" runat="server" Text='<%# Eval("ID") %>' />
  37.                 
  38.                 sname:
  39.                 "snameLabel" runat="server" Text='<%# Eval("sname") %>' />
  40.                 
  41.                 english:
  42.                 "englishLabel" runat="server" Text='<%# Eval("english") %>' />
  43.                 
  44.                 distrubute:
  45.                 "distrubuteLabel" runat="server" 
  46.                     Text='<%# Eval("distrubute") %>' />
  47.                 
  48.                 finalpoint:
  49.                 "finalpointLabel" runat="server" 
  50.                     Text='<%# Eval("finalpoint") %>' />
  51.                 
  52.                 "LinkButton1" runat="server" CommandName="edit">修改
  53.                   
  54.                 "LinkButton2" runat="server" CommandName="delete"> 删除
  55.             
  56.         

 

在后台,首先是实现数据源的绑定:

  1.             if(!IsPostBack)
  2.             {
  3.                 //bing for DataList3
  4.                 this.bind();
  5.             }
  6.         private void bind()
  7.         {
  8.             db sdb = new db();
  9.             DataList3.DataSource = sdb.dt("SELECT top 10 [ID], [sname], [english], [distrubute], [finalpoint], [sbool] FROM [sscore_OLD_local] ORDER BY [ID]");
  10.             DataList3.DataKeyField = "id";//跟新的时候根据这个字段
  11.             DataList3.DataBind();
  12.         }

 

然后是几个事件函数的编写:

  1.         protected void DataList3_CancelCommand(object source, DataListCommandEventArgs e)
  2.         {
  3.             DataList3.EditItemIndex = -1;
  4.             this.bind();
  5.         }
  6.         protected void DataList3_DeleteCommand(object source, DataListCommandEventArgs e)
  7.         {
  8.             String id = DataList3.DataKeys[e.Item.ItemIndex].ToString();
  9.             db sdb = new db();
  10.             string deletestr = "DELETE FROM [sscore_OLD_local] WHERE [ID] = '" + id + "'";
  11.             if (sdb.sql(deletestr) > 0)
  12.             {
  13.                 Response.Write("");
  14.                 DataList3.EditItemIndex = -1;
  15.                 this.bind();
  16.             }
  17.         }
  18.         protected void DataList3_UpdateCommand(object source, DataListCommandEventArgs e)
  19.         {
  20.             String id = DataList3.DataKeys[e.Item.ItemIndex].ToString();
  21.             String sname = ((TextBox)e.Item.FindControl("TextBox1")).Text;
  22.             float english = Convert.ToSingle(((TextBox)e.Item.FindControl("TextBox2")).Text);
  23.             float distrubute = Convert.ToSingle(((TextBox)e.Item.FindControl("TextBox3")).Text);
  24.             float finalpoint = Convert.ToSingle(((TextBox)e.Item.FindControl("TextBox4")).Text);
  25.             db sdb = new db();
  26.             string str = "UPDATE [sscore_OLD_local] SET [SNAME] = '" + sname + "',[ENGLISH] = '" + english + "',[DISTRUBUTE] = '" + distrubute + "',[FINALPOINT] = '" + finalpoint + "' WHERE  [ID] = '" + id + "'";
  27.             if (sdb.sql(str) > 0)
  28.             {
  29.                 Response.Write("");
  30.                 DataList3.EditItemIndex = -1;
  31.                 this.bind();
  32.             }
  33.         }
  34.         protected void DataList3_EditCommand(object source, DataListCommandEventArgs e)
  35.         {
  36.             DataList3.EditItemIndex = e.Item.ItemIndex;
  37.             this.bind();
  38.         }

 

同样,db类,在后边给出。

 

四、实现DataList的分页:

       分页的时候,在数据绑定,跟前边是类似的:也将代码贴出来,方便看:

  1. "DataList4" runat="server" CellPadding="4" ForeColor="#333333" 
  2.             onitemdatabound="DataList4_ItemDataBound" RepeatDirection="Horizontal">
  3.             "#990000" Font-Bold="True" ForeColor="White" />
  4.             "White" />
  5.             "#FFFBD6" ForeColor="#333333" />
  6.             "#FFCC66" Font-Bold="True" ForeColor="Navy" />
  7.             
  8.                 演示四:实现分页
  9.             
  10.             "#990000" Font-Bold="True" ForeColor="White" />
  11.             
  12.                 "ph" runat="server">
  13.                 实现分页
  14.             
  15.             
  16.             ID:"IDLabel" runat="server" Text='<%# Eval("ID") %>' />
  17.                 
  18.                 sname:
  19.                 "snameLabel" runat="server" Text='<%# Eval("sname") %>' />
  20.                 
  21.                 english:
  22.                 "englishLabel" runat="server" Text='<%# Eval("english") %>' />
  23.                 
  24.                 distrubute:
  25.                 "distrubuteLabel" runat="server" 
  26.                     Text='<%# Eval("distrubute") %>' />
  27.                 
  28.                 finalpoint:
  29.                 "finalpointLabel" runat="server" 
  30.                     Text='<%# Eval("finalpoint") %>' />
  31.                
  32.         

数据绑定:

 

             if (!IsPostBack)             {                  //page for DataList4                  int  n; //初始页码,通过绑定传进去                  if (Request.QueryString[ "page" ] !=  null )                 {                     n = Convert.ToInt32(Request.QueryString[ "page" ]);                 }                  else                 {                     n = 0;                 }                 bind4(n);             }          private   void  bind4( int  n)         {             db sdb =  new  db();             DataList4.DataSource = sdb.pds(n);             DataList4.DataBind();         }

 

分页的操作,主要是用DataList的ItemDataBound事件来完成,也就是在ItemTemplate的数据绑定之后,就通过来事件来设定其FooterTemplate模板中的分页信息,为此,先在DataList的FooterTemplate中放一个PlaceHolder,然后,将分页信息放在这个PlaceHolder中。

  1.         protected void DataList4_ItemDataBound(object sender, DataListItemEventArgs e)
  2.         {
  3.             if (e.Item.ItemType == ListItemType.Footer)
  4.             {//分页,主要是对Footer模板做这件事情
  5.                 PlaceHolder ph = (PlaceHolder)e.Item.FindControl("ph");
  6.                 db sdb = new db();
  7.                 for (int i = 0; i < sdb.pds().PageCount;i++ )
  8.                 {
  9.                     HyperLink h1 = new HyperLink();
  10.                     Literal ltl = new Literal();
  11.                     int n = i + 1;
  12.                     h1.Text = n.ToString();
  13.                     h1.ID = n.ToString();
  14.                     h1.NavigateUrl = "~/DataListStu.aspx?page=" + i.ToString();
  15.                     ltl.Text = " ";
  16.                     ph.Controls.Add(h1);
  17.                     ph.Controls.Add(ltl);
  18.                 }
  19.             }
  20.         }

最后给出,这个控件中用到的db类:

  1. public class db
  2.     {
  3.         protected string conn;
  4.         private int pagesize;
  5.         public db(){
  6.             conn = ConfigurationManager.ConnectionStrings["DbOneConnectionString"].ConnectionString;
  7.             pagesize = 4;
  8.         }
  9.         public DataTable dt(string query)
  10.         {
  11.             SqlConnection con = new SqlConnection(conn);
  12.             SqlDataAdapter sda = new SqlDataAdapter(query, con);
  13.             DataSet ds = new DataSet();
  14.             sda.Fill(ds,"name");
  15.             return ds.Tables["name"];
  16.         }
  17.         public PagedDataSource pds(int n)//int pg
  18.         {
  19.             PagedDataSource pds = new PagedDataSource();
  20.             pds.DataSource = dt("SELECT TOP 30 [ID], [sname], [english], [distrubute], [finalpoint] FROM [sscore_OLD_local] ORDER BY [ID]").DefaultView;//
  21.             //SELECT TOP 10 * FROM SSCORE_OLD_local
  22.             pds.AllowPaging = true;
  23.             pds.PageSize = pagesize;
  24.             pds.CurrentPageIndex = n;// pds.CurrentPageIndex;
  25.             return pds;
  26.         }
  27.         public PagedDataSource pds()//int pg
  28.         {
  29.             PagedDataSource pds = new PagedDataSource();
  30.             pds.DataSource = dt("SELECT TOP 30 [ID], [sname], [english], [distrubute], [finalpoint] FROM [sscore_OLD_local] ORDER BY [ID]").DefaultView;//
  31.             //SELECT TOP 10 * FROM SSCORE_OLD_local
  32.             pds.AllowPaging = true;
  33.             pds.PageSize = pagesize;
  34.             pds.CurrentPageIndex = pds.CurrentPageIndex;
  35.             return pds;
  36.         }
  37.         public int sql(string sqlstr)
  38.         {
  39.             SqlConnection con = new SqlConnection(conn);
  40.             con.Open();
  41.             SqlCommand cmd = new SqlCommand(sqlstr, con);
  42.             int a = cmd.ExecuteNonQuery();
  43.             con.Close();
  44.             return a;
  45.         }
  46.     }

 

遗憾的是,这样做呢,有个小小的问题。那就是,如果要同时做编辑和分页的话,这样分页就会有问题,一种解决方法是将分页信息放到外边的Label中,再把这个Label放到DataList的下边。

你可能感兴趣的:(AspDotNet)