65.9K
CodeProject 正在变化。 阅读更多。
Home

使用后台数据集动态加载数据到手风琴控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (14投票s)

2010年12月28日

CPOL

3分钟阅读

viewsIcon

101188

downloadIcon

4825

使用后台数据集填充手风琴 Ajax 控件

引言

在本文中,我使用代码后台数据集填充了手风琴控件。所以来深入了解一下这篇文章吧。这是我在 CodeProject 上的第一篇文章。我发布这篇文章是因为我在一个项目中遇到了这个问题。所以,我与大家分享。也许您也面临同样的问题。

Using the Code

对于这篇文章,您应该在您的计算机上安装 Visual Studio 2005 或更高版本,Microsoft SQL Server。

创建一个数据库,其中包含一个包含 TitleDetail 字段或列的表

Untitled.jpg

现在,来创建 Visual Studio ASP.NET 网站,在页面上从工具箱中拖放脚本管理器和手风琴控件到页面上。代码将如下所示

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
	Inherits="_Default" %>

<%@ Register Assembly="AjaxControlToolkit"
	Namespace="AjaxControlToolkit" TagPrefix="asp" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head  runat="server">
    <title></title>
    <link href="Styles/accordion.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1"  runat="server">

        <asp:ScriptManager ID="ScriptManager1" runat="server">

        <asp:Accordion ID="acrDynamic" runat="server" SelectedIndex="0"
	HeaderCssClass="headerAccordion" ContentCssClass="contentAccordion">

    </form>
</body>

手风琴控件的样式表标签是

.contentAccordion{
padding:4px;
background-color:Olive;
}
.headerAccordion
{
color:white;
background-color:Navy;
padding:4px;
border:solid 1px black;
}

现在您已经放置了手风琴控件和脚本管理器。在进入手风琴的动态填充之前,先介绍一下手风琴控件中的 static 数据。当您在手风琴控件中添加 static 数据时,您必须遵循以下步骤。

步骤 1

从工具箱中添加手风琴控件

<asp:Accordion ID="acrStatic" runat="server"
	HeaderCssClass="headerAccordion" ContentCssClass="contentAccordion">

</asp:Accordion>

第二步

Panes 标签放在手风琴控件的结束标签内

<asp:Accordion ID="acrStatic" runat="server"
	HeaderCssClass="headerAccordion" ContentCssClass="contentAccordion"> 

<panes></panes>

</asp:Accordion>

步骤 3

<panes> 的结束标签内,从工具箱中根据您的需求放置手风琴窗格。在每个手风琴窗格中,插入 HeaderContent 标签,例如

<asp:Accordion ID="acrStatic" runat="server">
      <Panes>
                  <asp:AccordionPane ID="AccordionPane1" runat="server">
                                  <Header> First Header</Header>
                                  <Content>Contents with in the ist header </Content>
                  </asp:AccordionPane>
                  <asp:AccordionPane ID="AccordionPane2" runat="server">
                                  <Header>Second Header</Header>
                                  <Content>Content with in the second Header</Content>
                                  </asp:AccordionPane>
      </Panes>
</asp:Accordion>

这就是关于手风琴控件中的 static 数据。希望您已经掌握了手风琴控件及其子控件和内部标签的确切层次结构。这只是为了向您介绍层次结构。

现在是动态部分...

希望您熟悉什么是 dataset 以及如何通过 C# 代码从 SQL 数据库获取数据。使用以下代码,我从数据库中获取 dataset

string sql = "select * from tbl_Contents where CategoryID=37 and _
	Title like 'What is Accordion control%'";
SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings_
	["dbconnectionRW"].ToString());
SqlCommand cmd = new SqlCommand(sql, con);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);

int i =0; 	// I will use this for creating unique accordion panes
		// in each iteration of the loop
Label lblTitle; 	// This i will use as a child control to handle Header Text
		// in the accordion pane
Label lblConten; 	// This i will use as a child control to handle Content Text
		// in the accordion pane
AjaxControlToolkit.AccordionPane pn; // I have declared an accordion pane but
		// not yet initialized

如果您使用 datatable 而不是 dataset 也是可以的。我个人也推荐使用 Datatable,而不是 dataset,但在这里我使用了 dataset 来对应文章标题。

foreach(DataRow dr in ds.Tables[0].Rows)
{
lblTitle = new Label();
lblContent = new Label();
lblTitle.Text=dr["Title"].ToString();
lblContent.Text=dr["Detail"].ToString();
pn = new AjaxControlToolkit.AccordionPane();
pn.ID = "Pane" + i;
pn.HeaderContainer.Controls.Add(lblHtitle);
pn.ContentContainer.Controls.Add(lblContent);
acrDynamic.Panes.Add(pn);
++i;
}

我在代码中做了什么?使用 foreach 循环集合迭代器,在每次迭代中,我从数据集的 Table[0] 中获取一行,并将其存放在 DataRow dr 中,直到表中的记录结束。

lblTitle = new Label();
lblContent = new Label();
lblTitle.Text=dr["Title"].ToString();
lblContent.Text=dr["Detail"].ToString();

在这些语句中,我初始化了 lblTitlelblcontent 标签,以便它们存在并且可以保存窗格的文本数据。所以,我将数据库表的 Title 字段数据放置到 lblTitle,将数据库表的 Detail 字段数据放置到 lblContent

pn = new AjaxControlToolkit.AccordionPane();

在这里,在上面的语句中,我初始化了 AccordionPane,我在循环上方声明了它

pn.ID = "Pane" + i;

使用上面的语句,我在每次迭代中为手风琴窗格 pn 分配一个唯一的名称,因为我在每次迭代中都会递增,所以在每次迭代中,我都有一个唯一的 i 值,以便在每次迭代中创建的 accordionpane 变得唯一,否则它将无法工作,并由于 ID 冲突而产生多个 ID 的错误。

pn.HeaderContainer.Controls.Add(lblTitle);

pn.ContentContainer.Controls.Add(lblContent);

使用上面的语句,我将 lblTitle 添加为 PanelHeader 部分的子控件,并将 lblContent 添加为 PanelContent 部分的子控件。现在是时候将 accordionpane 添加到手风琴控件了,因此在下面的语句的帮助下,可以完成。

acrDynamic.Panes.Add(pn);

++i;      // incrementation so that in the next iteration I can have a unique value of i.

循环体在那里结束,但迭代没有结束。迭代将持续到最后一条记录。因此,在每次迭代中,它将创建窗格,并为窗格分配一个唯一的 ID,否则如果 ID 保持不变,它将生成一个错误。将这些标签分配给它们相应的部分。最后将窗格添加到 accordioncontrol 中,并为下一次迭代递增 i 变量。

转到页面的代码隐藏,它将如下所示

using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            PopulateAcrDynamically();
        }
    }
    private void PopulateAcrDynamically()
    {
        string sql = "select * from tbl_Contents";
        SqlConnection con = new SqlConnection
		(ConfigurationManager.AppSettings["dbConnection"]);
        SqlCommand cmd = new SqlCommand(sql, con);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
        if (ds.Tables[0].Rows.Count != 0)
        {
            Label lbTitle;
            Label lbContent;
            AjaxControlToolkit.AccordionPane pn;
            int i=0;     // This is just to use for assigning pane an id
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                lbTitle = new Label();
                lbContent = new Label();
                lbTitle.Text = dr["Title"].ToString();
                lbContent.Text = dr["Detail"].ToString();
                pn = new AjaxControlToolkit.AccordionPane();
                pn.ID = "Pane" + i;
                pn.HeaderContainer.Controls.Add(lbTitle);
                pn.ContentContainer.Controls.Add(lbContent);
                acrDynamic.Panes.Add(pn);
                ++i;
            }
        }
    }
}

现在在浏览器中运行。结果将是这样的

Result.jpg

还有一件事 - 如果您下载解决方案,并且在执行时遇到一些错误,请告诉我。

谢谢,祝您好运。期待您的评论和建议。此致。

© . All rights reserved.