`
maiguang
  • 浏览: 263412 次
  • 性别: Icon_minigender_1
  • 来自: 焦作
社区版块
存档分类
最新评论

动态生成DataGrid的模板列

阅读更多

有的时候我们需要邦定很复杂的DataGrid,我们知道DataGrid,DataList等控件都有Template列,我们可以通过动态的邦定模版列来实现,复杂逻辑的邦定。由于Page继承TemplateControl,所以在Page对象里面就可以使用TemplateControl类里面的方法LoadTemplate,我们可以利用这个方法加载指定路径用户控件来实现丰富的表示(顺便提一下还有一个LoadControl的方法和LoadTemplate有相同的参数类型,也就是说我们可以利用LoadControl方法动态的加载用户控件,可以实现自定义的用户界面,将页面元素分成一些小的用户控件可以根据用户的定义来加载),我们还可以实现Itemplate接口实现摸版列的动态邦定。

1、使用LoadTemplate实现:

       下面我们看一个例子,我们建立一个ASP.NET的Web应用程序,在添加一个ascx的用户控件叫webusercontrol1.ascx如下所示,该用户控件里面只有一个Label控件用来邦定一个Lastname字段:

<%@ Control Language="C#" %>

<asp:label ID="label1" Runat="server" text='<%# Databinder.Eval(((DataGridItem)Container).DataItem,"lastname")%>'></asp:label>

      接下来我们将要创建一个DataGrid控件DataGrid1,我们将在Page_Load事件里面添加如下的代码:

string connstr = @"Integrated Security=SSPI;User ID=sa;Initial Catalog=Northwind;Data Source=MyServer\NetSDK";

SqlConnection cnn=new SqlConnection(connstr);

SqlDataAdapter da=new SqlDataAdapter("select * from employees", cnn);

DataSet ds=new DataSet();

da.Fill(ds, "employees");

ITemplate temp= Page.LoadTemplate("webusercontrol1.ascx");

TemplateColumn tc=new TemplateColumn();

tc.HeaderText = "Last Name";

tc.ItemTemplate = temp;

DataGrid1.Columns.Add(tc);

DataGrid1.DataSource = ds;

DataGrid1.DataMember = "employees";

DataGrid1.DataBind();

先面我们分析一下上面的代码,我们使用一个SQL Server里面自带的示例数据库Northwind。我们将得到所有的员工信息,然后填充数据集,然后我们声明一个Itemplate类型的对象temp用来装载邦定的用户控件。我们在声明一个TemplateColumn来动态创建一个模版列,接下来我们给该模版列添加信息,其中包括HeaderText等等,由于我们将要邦定的事ItemTemplate所以我们将刚才装载的temp赋值给该模版列的ItemTemplate对象,最后我们就将新的摸版列添加到DataGrid里面并邦定数据。

注意到上面过程,我们的用户控件里面有一个数据邦定的Label这个很重要,只有这样我们才能实现数据邦定的功能,否则就是显示一个有着相同信息的列。

2、使用Itemplate实现:

上面我们使用LoadTemplate实现动态摸版列的邦定,接下来我们将使用Itemplate接口来实现。Itemplate接口有一个方法InstantiateIn(Control container)。这个方法必须指定摸版列的父亲控件。下面的代码将会实现Itemplate接口,我们使用下面的代码创建一个新的类:

using System;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Data;

 

namespace DynamicDataGridTemplates{

public class CTemplateColumn:ITemplate{

       private string colname;

       public CTemplateColumn(string cname){

              colname=cname;

       }

       //为了使用接口必须实现的方法

       public void InstantiateIn(Control container)       {

              LiteralControl l = new LiteralControl();

              l.DataBinding += new EventHandler(this.OnDataBinding);

              container.Controls.Add(l);

       }

       public void OnDataBinding(object sender, EventArgs e){

              LiteralControl l = (LiteralControl) sender;

              DataGridItem container = (DataGridItem) l.NamingContainer;

              l.Text = ((DataRowView)       container.DataItem)[colname].ToString();

       }

}

}

在构造函数里面我们为邦定列指定了列名。我们使用InstantiateIn创建了一个LiteralControl控件l,同时我们为这个控件添加事件邦定事件,这样我们可以在邦定DataGrid的时候可以处理邦定这个控件,同时为了实现事件邦定事件,我们还编写了事件处理函数OnDataBinding,在这里我们将用指定的列邦定数据。

接下来我们将我们的自定义的摸版列动态的添加到DataGrid里面,如下的代码是Page_Load里面的:

DataGrid datagrid1=new DataGrid();

TemplateColumn tc1=new TemplateColumn();

tc1.ItemTemplate=new CTemplateColumn("lastname");

tc1.HeaderText="Last Name";

datagrid1.Columns.Add(tc1);

Page.Controls[1].Controls.Add(datagrid1);

string connstr = @"Integrated Security=SSPI;User ID=sa;Initial

Catalog=Northwind;Data Source=MyServer\NetSDK";

SqlConnection cnn=new SqlConnection(connstr);

SqlDataAdapter da=new SqlDataAdapter("select * from employees", cnn)

DataSet ds=new DataSet();

da.Fill(ds, "employees");

datagrid1.DataSource = ds;

datagrid1.DataMember = "employees";

datagrid1.DataBind();

首先我们New一个DataGrid出来,然后声明一个模版列tc1,在设置tc1的ItemTemplate为我们自定一个模版列(不要忘了用列名这个参数),然后指定这个模版列的其他信息,最后利用DataSet邦定数据(不要忘了将控件添加到它的父控件里面,比如:datagrid1.Columns.Add(tc1);)。

分享到:
评论

相关推荐

    基于siverlight实现动态生成DataGrid模板列源码例子

    在这个特定的例子中,"基于Silverlight实现动态生成DataGrid模板列源码例子"是一个教程或项目,旨在教授如何在Silverlight应用中动态创建DataGrid的模板列。DataGrid是WPF和Silverlight中常用的数据展示控件,它允许...

    MVVM实现WPF中DataGrid动态列与编辑器

    3. **动态生成列**:在ViewModel中,你可以根据数据模型类的属性来动态生成DataGrid的列。可以使用反射机制遍历类的所有公共属性,并为每个属性创建一个DataGridTextColumn或DataGridTemplateColumn。例如,通过`...

    datagrid 多表头及动态生成的实现

    本文的目标是通过一个具体的案例来展示如何使用JQuery EasyUI的datagrid组件来实现多表头和根据数据库动态生成列的需求。 #### 解决方案 ##### 1. 后端逻辑准备 为了实现前端表格能够根据数据库内容动态变化,...

    动态的管理ASP.NET DataGrid数据列

    其中最常见的方法是在web forms设计器中增加,通过在控件工具箱中拖访DataGrid控件到web设计页面,然后在属性生成器中增加Columns列;还有一种方式就是在 HTML视图模式下更改HTML代码的方式增加Columns列。本文中将向...

    WPF动态添加行列DATAGRID

    DataGrid可以通过绑定到一个数据源(如ObservableCollection或List)来自动生成列,而行则会根据数据源中的对象数量自动创建。但是,如果数据源的结构未知或者需要在运行时动态调整列的数量和类型,我们需要手动处理...

    siverlight中根据XML模板生成动态类绑定到DataGrid源码例子

    本示例探讨了如何在Silverlight应用中利用XML模板生成动态类,并将其绑定到DataGrid控件,以实现数据的动态展示。下面将详细解释这一过程中的关键知识点。 首先,我们需要理解XML模板。XML(Extensible Markup ...

    wpf加载图片到datagrid动态控件

    这段代码定义了一个名为`imageGrid`的DataGrid,并且包含一个模板列来显示图片。Image控件的Source属性绑定到数据项的ImagePath属性,这样每行就可以显示对应的图片。 接下来,我们创建一个用于存储图片信息的数据...

    gird模板列的创建

    本示例主要介绍了如何在DataGrid中创建一个模板列,以显示数据表中存储的图片路径。这涉及到两个核心知识点:DataGrid的模板列使用和数据绑定。 首先,我们要理解DataGrid的模板列(TemplateColumn)。模板列允许...

    c# WPF DataGrid 底部汇总行合计

    另一种方法是在DataGrid中添加额外的列,这些列不与数据源绑定,但其内容由代码逻辑动态生成。在C#后台代码中,我们可以监听DataGrid的加载或数据源更改事件,然后遍历所有数据行,计算每列的总和,并将结果填充到...

    wpf DataGrid复合表头

    总结来说,实现WPF DataGrid的复合表头功能涉及视图模型的设计、数据模板的定义、列的配置以及对列拖放事件的处理。通过这些步骤,我们可以创建出既能清晰展示数据结构,又支持用户交互的复合表头。在实际项目中,...

    WPF DataGrid控件中的动态列(第1部分)

    `DataGrid`控件支持许多高级特性,如排序、分组、过滤等,这些也可以动态应用到动态生成的列上。结合`ICollectionView`接口,可以实现更灵活的数据操作。 综上所述,`WPF DataGrid`提供了丰富的功能来支持动态列的...

    easyui使用datagrid定制生成一个table

    **1.1 DataGrid 自动生成列与用户自定义列** EasyUI 的 DataGrid 控件支持两种方式的数据绑定:自动列生成和用户自定义列。 - **自动列生成**:当 `AutoGenerateColumns` 属性被设置为 `true` 时,DataGrid 会根据...

    datagrid的使用方法

    虽然 DataGrid 不直接支持嵌套,但可以通过模板列添加其他 DataGrid 实现嵌套效果。例如,可以创建一个内部 DataGrid 并在模板列的 `ItemTemplate` 中绑定。 7. **ASP.NET 2.0 及更高版本的新特性** ASP.NET 2.0 ...

    使用DataGrid完成一个行级数据折叠收缩展示的功能

    DataGrid通常绑定到一个数据源,如ObservableCollection或BindingList,它会根据数据源中的对象自动生成列,并在每一行中显示对象的属性值。在我们的场景中,我们将扩展这一基本功能,使其支持行的折叠和展开。 要...

    DataGridMVVM.zip_WPF MVVM datagrid_datagrid_datagrid mvvm_mvvm_w

    5. 动态列生成(Dynamic Columns):根据模型的属性动态生成DataGrid的列,这可以通过在ViewModel中实现逻辑,然后在View中使用DataTemplate来实现。 6. 其他高级功能:例如,使用ICollectionView接口实现数据排序...

    WPF DataGrid:将DataTemplates用于自动生成的列

    标题中的"将DataTemplates用于自动生成的列"意味着我们将讨论如何在DataGrid不手动指定每一列的情况下,让系统根据数据源的类型自动创建列,并使用DataTemplate来定制这些列的显示。DataTemplates是WPF中的一个重要...

    wpf通过datagrid操作数据库,实现datagrid增删改操作。

    DataGrid的列根据数据源的结构自动生成,但也可以手动定义以定制显示。通过使用`DataGridTextColumn`、`DataGridCheckBoxColumn`等不同类型的列,我们可以控制每列的显示和编辑行为。 3. **增删改操作**: - **...

    WPF中DataGrid的空白行使用方法

    `DataGrid`通常与数据绑定,自动根据数据源中的项生成行。然而,为了允许用户插入新的记录或提供额外的输入空间,我们可能希望在数据集之外添加一个或多个空白行。下面,我们将详细讨论实现这一功能的方法。 首先,...

    VS2003 datagrid全攻略

    - **插入**:通过在DataGrid中添加一个模板列,包含输入控件,用户可以直接在DataGrid内新增记录。 - **编辑**:设置`AllowEditing="true"`,DataGrid会在每一行显示编辑按钮,点击后切换为可编辑状态。 - **删除...

    wpf下的DataGrid实例

    2. **定义列**:DataGrid的列可以根据数据源的属性自动生成,也可以手动定义。通过`AutoGenerateColumns="False"`禁用自动列生成,然后使用`DataGridTextColumn`、`DataGridTemplateColumn`等来定制列的显示。我们...

Global site tag (gtag.js) - Google Analytics