gpt4 book ai didi

c# - 创建一个 Rich Repeater,DataBind 消除自定义添加的控件

转载 作者:太空宇宙 更新时间:2023-11-03 14:37:34 25 4
gpt4 key购买 nike

所以...我有一个聪明的想法,我会创建自己的 Repeater 控件,通过继承 Repeater 并扩展它的功能来实现分页和排序。我找到了一些关于如何解决这个问题的信息和点点滴滴,一切似乎都很好......

我创建了一个 WebControlLibrary 来存放我的自定义控件。除了丰富的转发器,我还创建了一个复合控件,它可以充当“寻呼机栏”,具有前进、后退和页面选择功能。我的寻呼栏 100% 独立工作,当用户与之交互时正确触发分页更改事件。丰富的转发器数据绑定(bind)没有问题,但是当数据绑定(bind)触发时(当我调用 base.databind() 时),控件集合被清除并且我的分页栏被删除。这搞砸了分页栏的 View 状态,使它们无法正确触发事件或保持状态。

我已经尝试在 base.databind() 触发后将控件添加回集合,但这并没有解决问题。我开始得到非常奇怪的结果,包括更改控件树层次结构的问题(通过添加 [ViewStateModeById] 解决)。

在我回到绘图板并创建第二个包含中继器和寻呼机条的复合控件(以便中继器不负责寻呼机条 View 状态)之前,是否有任何关于如何解决问题的想法?

为了共享和共享,转发器本身的代码在下面,分页条并不重要,因为问题实际上是维护任何其他子控件的状态。 (请原谅某些代码的粗糙......它仍在进行中)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

[ViewStateModeById]
public class SortablePagedRepeater : Repeater, INamingContainer {

private SuperRepeaterPagerBar topBar = new SuperRepeaterPagerBar();
private SuperRepeaterPagerBar btmBar = new SuperRepeaterPagerBar();

protected override void OnInit(EventArgs e) {
Page.RegisterRequiresControlState(this);

InitializeControls();
base.OnInit(e);
EnsureChildControls();
}

protected void InitializeControls() {
topBar.ID = this.ID + "__topPagerBar";
topBar.NumberOfPages = this._currentProperties.numOfPages;
topBar.CurrentPage = this.CurrentPageNumber;
topBar.PageChanged +=
new SuperRepeaterPagerBar.PageChangedEventHandler(PageChanged);

btmBar.ID = this.ID + "__btmPagerBar";
btmBar.NumberOfPages = this._currentProperties.numOfPages;
btmBar.CurrentPage = this.CurrentPageNumber;
btmBar.PageChanged +=
new SuperRepeaterPagerBar.PageChangedEventHandler(PageChanged);
}

protected override void CreateChildControls() {
EnsureDataBound();

this.Controls.Add(topBar);
this.Controls.Add(btmBar);
//base.CreateChildControls();
}

private void PageChanged(object sender, int newPage) {
this.CurrentPageNumber = newPage;
}

public override void DataBind() {
//pageDataSource();

//DataBind removes all controls from control collection...
base.DataBind();
Controls.Add(topBar);
Controls.Add(btmBar);
}

private void pageDataSource() {
//Create paged data source
PagedDataSource pds = new PagedDataSource();

pds.PageSize = this.ItemsPerPage;
pds.AllowPaging = true;

// first get a PagedDataSource going and perform sort if possible...
if (base.DataSource is System.Collections.IEnumerable) {
pds.DataSource = (System.Collections.IEnumerable)base.DataSource;
} else if (base.DataSource is System.Data.DataView) {
DataView data = (DataView)DataSource;
if (this.SortBy != null && data.Table.Columns.Contains(this.SortBy)) {
data.Sort = this.SortBy;
}
pds.DataSource = data.Table.Rows;
} else if (base.DataSource is System.Data.DataTable) {
DataTable data = (DataTable)DataSource;
if (this.SortBy != null && data.Columns.Contains(this.SortBy)) {
data.DefaultView.Sort = this.SortBy;
}
pds.DataSource = data.DefaultView;
} else if (base.DataSource is System.Data.DataSet) {
DataSet data = (DataSet)DataSource;
if (base.DataMember != null && data.Tables.Contains(base.DataMember)) {
if (this.SortBy != null && data.Tables[base.DataMember].Columns.Contains(this.SortBy)) {
data.Tables[base.DataMember].DefaultView.Sort = this.SortBy;
}
pds.DataSource = data.Tables[base.DataMember].DefaultView;
} else if (data.Tables.Count > 0) {
if (this.SortBy != null && data.Tables[0].Columns.Contains(this.SortBy)) {
data.Tables[0].DefaultView.Sort = this.SortBy;
}
pds.DataSource = data.Tables[0].DefaultView;
} else {
throw new Exception("DataSet doesn't have any tables.");
}
} else if (base.DataSource == null) {
// don't do anything?
} else {
throw new Exception("DataSource must be of type System.Collections.IEnumerable. The DataSource you provided is of type " + base.DataSource.GetType().ToString());
}


if (pds != null && base.DataSource != null) {
//Make sure that the page doesn't exceed the maximum number of pages
//available
if (this.CurrentPageNumber >= pds.PageCount) {
this.CurrentPageNumber = pds.PageCount - 1;
}

//Set up paging values...
btmBar.CurrentPage = topBar.CurrentPage = pds.CurrentPageIndex = this.CurrentPageNumber;
this._currentProperties.numOfPages = btmBar.NumberOfPages = topBar.NumberOfPages = pds.PageCount;

base.DataSource = pds;
}
}

public override object DataSource {
get {
return base.DataSource;
}
set {
//init(); //reset paging/sorting values since we've potentially changed data sources.
base.DataSource = value;
pageDataSource();
}
}

protected override void Render(HtmlTextWriter writer) {
topBar.RenderControl(writer);
base.Render(writer);
btmBar.RenderControl(writer);
}

[Serializable]
protected struct CurrentProperties {
public int pageNum;
public int itemsPerPage;
public int numOfPages;
public string sortBy;
public bool sortDir;
}

protected CurrentProperties _currentProperties = new CurrentProperties();

protected override object SaveControlState() {
return this._currentProperties;
}

protected override void LoadControlState(object savedState) {
this._currentProperties = (CurrentProperties)savedState;
}

[Category("Status")]
[Browsable(true)]
[NotifyParentProperty(true)]
[DefaultValue("")]
[Localizable(false)]
public string SortBy {
get { return this._currentProperties.sortBy; }
set {
//If sorting by the same column, swap the sort direction.
if (this._currentProperties.sortBy == value) {
this.SortAscending = !this.SortAscending;
} else {
this.SortAscending = true;
}
this._currentProperties.sortBy = value;
}
}

[Category("Status")]
[Browsable(true)]
[NotifyParentProperty(true)]
[DefaultValue(true)]
[Localizable(false)]
public bool SortAscending {
get { return this._currentProperties.sortDir; }
set { this._currentProperties.sortDir = value; }
}

[Category("Status")]
[Browsable(true)]
[NotifyParentProperty(true)]
[DefaultValue(25)]
[Localizable(false)]
public int ItemsPerPage {
get { return this._currentProperties.itemsPerPage; }
set { this._currentProperties.itemsPerPage = value; }
}

[Category("Status")]
[Browsable(true)]
[NotifyParentProperty(true)]
[DefaultValue(1)]
[Localizable(false)]
public int CurrentPageNumber {
get { return this._currentProperties.pageNum; }
set {
this._currentProperties.pageNum = value;
pageDataSource();
}
}
}

最佳答案

您还可以使用新的 ASP.NET ListView control (自 .Net 3.5 起)它具有分页/排序数据绑定(bind)和模板,这意味着您可以将它用作转发器或者非常容易地做复杂的事情,比如带有内联编辑的网格之类的显示。

关于c# - 创建一个 Rich Repeater,DataBind 消除自定义添加的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/334723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com