DATAGRID自定义控件的问题

hubro 2005-05-13 09:56:01
先看下面的代码
using System;
using System.Web;
using System.IO;
using System.Data;
using System.Data.OleDb;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Collections;
using System.Configuration;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.Security;
using article;
//中文么//
namespace MyDataGrid
{
public class Grid:WebControl,INamingContainer
{
function datacommand=new function();
public DataGrid TheGrid=new DataGrid();
public Button delbutton=new Button();
public Label PageLabel = new Label();
public String _sql;
public int _pagesize;
public String _cells;

public String sql
{
get { return _sql;}
set { _sql = value;}
}

public int pagesize
{
get { return _pagesize;}
set { _pagesize = value;}
}

public String cells
{
get { return _cells;}
set { _cells = value;}
}

public string[] thecel()
{
return cells.Split(',');
}
public String datadb()
{
Regex regexmail = new Regex(@"from (\w+)");
return regexmail.Match(sql).Groups[1].ToString();
}
public void pagebind()
{
//PageLabel.Text+=1;
TheGrid.DataSource=datacommand.GetDataList(sql);
TheGrid.DataBind();
}
private void SubmitBtn_Click(object sender, EventArgs e)
{
PageLabel.Text=TheGrid.Items.Count.ToString();
for (int j=0;j<this.TheGrid.Items.Count;j++)
{

CheckBox CB=(CheckBox)this.TheGrid.Items[j].FindControl("del");
string lb=TheGrid.Items[j].Cells[2].Text;

if (CB.Checked==true)
datacommand.update("delete from "+datadb()+" where id="+int.Parse(lb)+"");
}
pagebind();
}
public void MyDataGrid_Page(Object sender, DataGridPageChangedEventArgs e)
{
PageLabel.Text="hubro";
TheGrid.CurrentPageIndex = e.NewPageIndex;
pagebind();
}
public void MyDataGrid_Update(Object sender, DataGridCommandEventArgs e)
{
}
public void MyDataGrid_Edit(Object sender, DataGridCommandEventArgs e) {
TheGrid.EditItemIndex = (int)e.Item.ItemIndex;
pagebind();
}

public void MyDataGrid_Cancel(Object sender, DataGridCommandEventArgs e) {
PageLabel.Text="hubro";
TheGrid.EditItemIndex = -1;
pagebind();
}
public Grid()
{
TheGrid.CellPadding=4;
TheGrid.CellSpacing=0;
TheGrid.AllowPaging=true;
TheGrid.AutoGenerateColumns=false;
TheGrid.PagerStyle.Mode=PagerMode.NumericPages;
TheGrid.HeaderStyle.BackColor=System.Drawing.Color.FromName("#f0f0f0");
TheGrid.PageIndexChanged+=new DataGridPageChangedEventHandler(this.MyDataGrid_Page);
TheGrid.EditCommand+=new DataGridCommandEventHandler(this.MyDataGrid_Edit);
TheGrid.CancelCommand+=new DataGridCommandEventHandler(this.MyDataGrid_Cancel);
TheGrid.UpdateCommand+=new DataGridCommandEventHandler(this.MyDataGrid_Update);
this.Controls.Add(this.TheGrid);
delbutton.Text="Del";
delbutton.Click += new EventHandler(this.SubmitBtn_Click);
this.Controls.Add(this.delbutton);
this.Controls.Add(this.PageLabel);
}
protected override void Render(HtmlTextWriter output)
{
TheGrid.PageSize=20;
if (pagesize>0)
TheGrid.PageSize=pagesize;

EditCommandColumn theedit=new EditCommandColumn();
theedit.EditText="编辑";
theedit.CancelText="取消";
theedit.UpdateText="修改";
theedit.ItemStyle.Wrap=false;
theedit.HeaderText="操作";
theedit.HeaderStyle.Wrap=false;
TheGrid.Columns.Add(theedit);

TemplateColumn tm2=new TemplateColumn();
tm2.ItemTemplate=new checkbox();
tm2.HeaderText="选择";
TheGrid.Columns.Add(tm2);
for (int ii=0;ii<thecel().Length;ii++)
{
BoundColumn tm=new BoundColumn();
tm.HeaderText=thecel()[ii];
tm.DataField=thecel()[ii];
TheGrid.Columns.Add(tm);
}
pagebind();
this.TheGrid.RenderControl(output);
this.delbutton.RenderControl(output);
this.PageLabel.RenderControl(output);
}

}
public class checkbox : ITemplate
{
public void InstantiateIn(Control container)
{
CheckBox thecheck=new CheckBox();
thecheck.ID="del";
container.Controls.Add(thecheck);
}
}

}
DATAGRID的分页事件是这样写的
TheGrid.PageIndexChanged+=new DataGridPageChangedEventHandler(this.MyDataGrid_Page);

public void MyDataGrid_Page(Object sender, DataGridPageChangedEventArgs e)
{
PageLabel.Text="hubro";//我在这里跟踪一下,看有没执行
TheGrid.CurrentPageIndex = e.NewPageIndex;
pagebind();
}

结果,没执行,其它事件也是如此,不知为什么,哪位高手知道
...全文
118 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxilu 2005-05-13
  • 打赏
  • 举报
回复
你可能要在CreateChildControls将grid加入
hubro 2005-05-13
  • 打赏
  • 举报
回复
看不明,我现在的问题是事件不知道怎么写
Richardhu 2005-05-13
  • 打赏
  • 举报
回复
还有一个JS文件date_control.js
var errorType = 0;
/*
1 = date required
2 = incomplete
3 = not a real date
*/
function DateControlIsValid(val)
{
var sControlName = val.controltovalidate;

if(val.required == 'true')
var sExec = "var bReturn = requiredDateControl(Form1." + sControlName + "_Day.value, Form1." + sControlName + "_Month.selectedIndex, Form1." + sControlName + "_Year.value);";
else
var sExec = "var bReturn = optionalDateControl(Form1." + sControlName + "_Day.value, Form1." + sControlName + "_Month.selectedIndex, Form1." + sControlName + "_Year.value);";
eval(sExec);
if(!bReturn)
{
val.innerHTML = displayError(errorType, sControlName);
}
else
{
val.innerHTML = "";
}
val.errormessage = val.innerHTML;
return bReturn;
}

function requiredDateControl(dayValue, monthValue, yearValue)
{
if(dayValue == '' || monthValue == '' || yearValue == '')
{
errorType = 1;
return false;
}
var daysPerMonth = getDaysofYear(yearValue);
if(dayValue > daysPerMonth[monthValue])
{
errorType = 3;
return false;
}
return true;
}

function optionalDateControl(dayValue, monthValue, yearValue)
{

if(dayValue == '' && monthValue == '' && yearValue == '')
{
return true;
}
if(dayValue == '' || monthValue == '' || yearValue == '')
{
errorType = 2;
return false;
}
if(dayValue != '' && monthValue != '' && yearValue != '')
{
var daysPerMonth = getDaysofYear(yearValue);
if(dayValue > daysPerMonth[monthValue])
{
errorType = 3;
return false;
}
}
return true;
}
function getDaysofYear (Year)
{
if (leapYear (Year)==1)
Leap=29;
else
Leap=28;
daysOfYear = new Array(0, 31, Leap, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
return (daysOfYear);
}

function leapYear (Year)
{
if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0))
return (1);
else
return (0);
}


function displayError(nType, sName)
{

if(nType == 1)
return 'This date is a required field.';
if(nType == 2)
return 'Please enter a complete date.';
if(nType == 3)
{
var sMonth = eval('document.Form1.' + sName + '_Month[document.Form1.' + sName + '_Month.selectedIndex].text;');
var sExec = 'var nDay = Form1.' + sName + '_Day.value';
eval(sExec);
return 'The month of ' + sMonth + ' does not contain ' + nDay + ' days.';
}
}
Richardhu 2005-05-13
  • 打赏
  • 举报
回复
/*
* Routine Name: CreateChildControls
* Purpose: Override the default behavior to add Child controls
* Arguments: None
* Comments: */
protected override void CreateChildControls()
{
int nYear;
int i;

//Create the days dropdown list, fill with array declared above
dayList = new System.Web.UI.WebControls.DropDownList();
dayList.SelectedIndex = this.SelectedDay;
dayList.DataSource = DayArray;
dayList.DataBind();
dayList.ID = "Day";
this.Controls.Add(dayList);

//Create the months dropdown list, fill with array declared above
monthList = new System.Web.UI.WebControls.DropDownList();
monthList.SelectedIndex = this.SelectedMonth;
monthList.ID = "Month";
monthList.DataSource = MonthArrayLong;
monthList.DataBind();
this.Controls.Add(monthList);

//Fill years array based on the number of years back that was specified by the user
YearArray = new string[_years + cYEARS_FORWARD]; //1 extra=blank item in list

yearList = new System.Web.UI.WebControls.DropDownList();
nYear = DateTime.Now.Year;
YearArray[0] = "";
for(i = 1;i <= YearArray.GetUpperBound(0);i++)
{
YearArray[i] = Convert.ToString(nYear - _years + (i - 1));
if(YearArray[i] == Convert.ToString(this.SelectedYear))
{
//Set the selected index if a match is found
yearList.SelectedIndex = i;
}
}
yearList.ID = "Year";
yearList.DataSource = YearArray;
yearList.DataBind();
this.Controls.Add(yearList);
}

/*
* Function Name: LoadPostData
* Purpose:
* Arguments:
* Returns:
* Comments: */
bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)
{
int Day = 0;
int Month = 0;
int Year = 0;
bool Changed = false;
string MonthName;

if(postCollection[this.UniqueID.ToString() + ":Day"] != "")
{
Day = Int32.Parse(postCollection[this.UniqueID.ToString() + ":Day"]);
if (Day != this.SelectedDay)
{
this.SelectedDay = Day;
Changed = true;
}
}
else
{
if(this.SelectedDay != -1)
{
this.SelectedDay = -1;
Changed = true;
}
}

MonthName = postCollection[this.UniqueID.ToString() + ":Month"];
if (MonthName != "")
{
Month = Array.IndexOf(this.MonthArrayLong, MonthName);
if(Month != this.SelectedMonth)
{
this.SelectedMonth = Month;
Changed = true;
}
}
else
{
if(this.SelectedMonth != -1)
{
this.SelectedMonth = -1;
Changed = true;
}
}

if(postCollection[this.UniqueID.ToString() + ":Year"] != "")
{
Year = Int32.Parse(postCollection[this.UniqueID.ToString() + ":Year"]);
if (Year != this.SelectedYear)
{
this.SelectedYear = Year;
Changed = true;
}
}
else
{
if(this.SelectedYear != -1)
{
this.SelectedYear = -1;
Changed = true;
}
}
if(this.SelectedDay == -1 && this.SelectedMonth == -1 && this.SelectedYear == -1)
this.Value = "";
else
this.Value = this.SelectedMonth.ToString() + "/" + this.SelectedDay.ToString() + "/" + this.SelectedYear.ToString();

return Changed;
}

void IPostBackDataHandler.RaisePostDataChangedEvent()
{
this.OnChanged(EventArgs.Empty);
}
}

public class DateControlValidator: BaseValidator
{
bool ControlRequired;

public bool Required
{
get
{
return ControlRequired;
}
set
{
ControlRequired = value;
}
}

protected override bool EvaluateIsValid()
{
string Value = this.GetControlValidationValue(this.ControlToValidate);
return this.IsValidDate(Value);
}

private bool IsValidDate(string Item)
{
if(ControlRequired == true && Item == "")
{
this.ErrorMessage = "A complete date is required";
return false;
}
else if(ControlRequired == false && Item == "")
{
return true;
}

DateTime formattedDate;
System.Globalization.CultureInfo format = new System.Globalization.CultureInfo("en-US", true);
try
{
formattedDate = DateTime.ParseExact(Item, "d", format);
return true;
}
catch
{
this.ErrorMessage = Item + " is not a valid date.";
return false;
}
}

protected override void AddAttributesToRender(HtmlTextWriter writer)
{
if(this.DetermineRenderUplevel() && this.EnableClientScript)
{
base.AddAttributesToRender(writer);
writer.AddAttribute("controltovalidate", this.ControlToValidate);
writer.AddAttribute("evaluationfunction", "DateControlIsValid");
writer.AddAttribute("display", this.Display.ToString());
writer.AddAttribute("style", "display:none");
writer.AddAttribute("errormessage", this.ErrorMessage);
if(ControlRequired)
writer.AddAttribute("required", "true");
else
writer.AddAttribute("required", "false");
}
}

protected override void OnPreRender(EventArgs e)
{
if(this.DetermineRenderUplevel() && this.EnableClientScript)
{
string EOL = Environment.NewLine;
StringBuilder script = new StringBuilder();

//Make sure the MS standard javascript file is included
this.RegisterValidatorCommonScript();


//Include our own file for the control
script.Append("<script language='javascript' src='date_control.js'></script>" + EOL);
Page.RegisterClientScriptBlock("DateValidate", script.ToString());


//Register this validator in the array of validators on the page, and the array of
// date controls on the page
string element = "document.all[\"" + ClientID + "\"]";
Page.RegisterArrayDeclaration("Date_Controls", element);
Page.RegisterArrayDeclaration("Page_Validators", element);

//Because the date control is a composite control, there is no single HTML control to
// bind the evaluation function to. Therefore, the MS javascript disables this validator.
// The client script below re-enables the validator when the page is submitted.
script.Remove(0, script.Length - 1);
script.Append("<script language='javascript'>");
//This is the "Microsoft Preferred" method for enabling a control, but it causes the
// control to validate, causing an immediate error condition when the field is required.
// script.Append(sVbCrLf)
// script.Append("ValidatorEnable(" & ClientID & ", true);")

// Instead I am setting the enabled property directly of all registered date controls.
script.Append(EOL);
script.Append("var x;");
script.Append(EOL);
script.Append("for (x = 0; x < Date_Controls.length; x++)");
script.Append(EOL);
script.Append("Date_Controls[x].enabled = true;");
script.Append(EOL);
script.Append("</script>");
script.Append(EOL);
Page.RegisterStartupScript("SetEnabled", script.ToString());
}

}

}
Richardhu 2005-05-13
  • 打赏
  • 举报
回复
这是我做的一个控件,下面是C#代码
[ValidationProperty("Value"), DefaultProperty("Value")]
public class DateControl: Control, INamingContainer, IPostBackDataHandler
{
#region PrivateVars

//The number of years forward the conrol will populate the year array
const int cYEARS_FORWARD = 2;

//The number of years backward from this year in the year array
private int _years = 30;

//Set the control's value to the current date?
private bool _setCurrent = false;

//The listboxes to render on the page
private System.Web.UI.WebControls.DropDownList dayList;
private System.Web.UI.WebControls.DropDownList yearList;
private System.Web.UI.WebControls.DropDownList monthList;

//The arrays used to populate the list boxes
// The blanks at the beginning are for a blank item in the list box
private string[] DayArray = {"", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"};
private string[] MonthArrayLong = {"", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
private string[] YearArray;

private static readonly object EventControlChanged = new object();

#endregion

#region Properties
//All properties depend on ViewState

//This value is a string, not a date type
// so we can handle invalid conditons easier
public string Value
{
get
{
string s = (string)ViewState["Value"];
if(s == null)
return String.Empty;
else
return s;
}
set
{
this.SetSelected(value);
ViewState["Value"] = value;
}
}

private int SelectedDay
{
get
{
if(ViewState["SelectedDay"] == null)
return -1;
else
return (int)ViewState["SelectedDay"];
}
set
{
ViewState["SelectedDay"] = value;
}
}

private int SelectedMonth
{
get
{
if(ViewState["SelectedMonth"] == null)
return -1;
else
return (int)ViewState["SelectedMonth"];
}
set
{
ViewState["SelectedMonth"] = value;
}
}

private int SelectedYear
{
get
{
if(ViewState["SelectedYear"] == null)
return -1;
else
return (int)ViewState["SelectedYear"];
}
set
{
ViewState["SelectedYear"] = value;
}
}

//When this property is true, set the control's value to the current date
public bool SelectCurrentDate
{
get
{
return (bool)ViewState["SelectCurrentDate"];
}

set
{
ViewState["SelectCurrentDate"] = value;
_setCurrent = value;
if(_setCurrent)
this.Value = DateTime.Today.ToShortDateString();
}
}
//Give the user the option of how many years in the past they would like the control to display
public int YearsBack
{
get
{
return (int)ViewState["YearsBack"];
}
set
{
_years = value;
ViewState["YearsBack"] = value;
}
}
#endregion

//Wire the events so the control can participate in them
public DateControl()
{
this.Load += new System.EventHandler(Page_Load);
this.Init += new System.EventHandler(Page_Init);
}

//Register the control with the page's postback mechanism, or
// the control will not update on Postback
public void Page_Init(Object Source, EventArgs e)
{
if(Page != null)
{
Page.RegisterRequiresPostBack(this);
}
}

//Be sure child controls exist so they can be manipulated
public void Page_Load(Object Source, EventArgs e)
{
EnsureChildControls();
}

public event EventHandler Changed
{
add
{
Events.AddHandler(EventControlChanged, value);
}
remove
{
Events.RemoveHandler(EventControlChanged, value);
}
}

protected virtual void OnChanged(EventArgs e)
{
EventHandler ControlChanged = (EventHandler)Events[EventControlChanged];
if(ControlChanged != null)
ControlChanged(this, e);
}
/*
* Routine Name: SetSelected
* Purpose: Take the value, and set the selected values of the
* three listboxes the make up the control
* Arguments:
* Comments: */
private void SetSelected(string When)
{
string[] ResultList;
Regex DateSplitter = new Regex("^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$");
if(DateSplitter.IsMatch(When)) //The date has a good format
{
char divider = '/';
ResultList = When.Split(divider);

SelectedMonth = Int32.Parse(ResultList[0]);
SelectedDay = Int32.Parse(ResultList[1]);
SelectedYear = Int32.Parse(ResultList[2]);
}
else //When must be empty or not recognizable, so set the listboxes to the empty value
{
SelectedDay = -1;
SelectedMonth = -1;
SelectedYear = -1;
}
}
/*
Function Name: IsValidDate
Purpose: test the validity of the date entered
Arguments: The "date" as s string
Returns: true/false
Comments: */
private bool IsValidDate(string sItem, out DateTime ReturnDate)
{
System.Globalization.CultureInfo format = new System.Globalization.CultureInfo("en-US", true);

try
{
ReturnDate = DateTime.ParseExact(sItem, "d", format);
return true;
}
catch
{
ReturnDate = System.DateTime.MinValue; //Can't return a null reference here...
return false;
}
}


hubro 2005-05-13
  • 打赏
  • 举报
回复
老大,我写的是自定义控件
bandt 2005-05-13
  • 打赏
  • 举报
回复
你这段代码倒是写的大气磅礴,可是有点不实用哦,给你一个经典例子参考:
<%@ Import Namespace="System.Data.SqlClient" %>

<Script Runat="Server">

Dim conNorthwind As SqlConnection
Dim cmdSql As SqlCommand
Dim strSql As String

Sub Page_Load
conNorthwind = New SqlConnection( "Server=localhost;UID=sa;PWD=secret;Database=Northwind" )
If Not IsPostBack Then
BindDataGrid
End If
End Sub

Sub BindDataGrid
cmdSql = New SqlCommand( "Select * From Products", conNorthwind )
conNorthwind.Open()
dgrdProducts.DataSource = cmdSql.ExecuteReader()
dgrdProducts.DataBind()
conNorthwind.Close()
End Sub

Sub dgrdProducts_EditCommand( s As Object, e As DataGridCommandEventArgs )
dgrdProducts.EditItemIndex = e.Item.ItemIndex
BindDataGrid
End Sub

Sub dgrdProducts_UpdateCommand( s As Object, e As DataGridCommandEventArgs )
Dim intProductID As Integer
Dim txtUnitPrice As TextBox
Dim decUnitPrice As Decimal

If IsValid Then
intProductID = dgrdProducts.DataKeys( e.Item.ItemIndex )
txtUnitPrice = e.Item.FindControl( "txtUnitPrice" )
decUnitPrice = txtUnitPrice.Text
strSql = "Update Products Set UnitPrice=@UnitPrice " _
& "Where ProductID=@ProductID"
cmdSql = New SqlCommand( strSql, conNorthwind )
cmdSql.Parameters.Add( "@UnitPrice", decUnitPrice )
cmdSql.Parameters.Add( "@ProductID", intProductID )
conNorthwind.Open()
cmdSql.ExecuteNonQuery()
conNorthwind.Close()
dgrdProducts.EditItemIndex = -1
BindDataGrid
End If
End Sub

Sub dgrdProducts_CancelCommand( s As Object, e As DataGridCommandEventArgs )
dgrdProducts.EditItemIndex = -1
BindDataGrid
End Sub

</Script>

<html>
<head><title>DataGridEditTemplate.aspx</title></head>
<body>
<form Runat="Server">

<asp:DataGrid
ID="dgrdProducts"
OnEditCommand="dgrdProducts_EditCommand"
OnUpdateCommand="dgrdProducts_Updatecommand"
OnCancelCommand="dgrdProducts_CancelCommand"
DataKeyField="ProductID"
AutoGenerateColumns="False"
CellPadding="10"
HeaderStyle-BackColor="Salmon"
Runat="Server">
<Columns>
<asp:BoundColumn
HeaderText="Product Name"
DataField="ProductName"
ReadOnly="True" />
<asp:TemplateColumn>
<HeaderTemplate>
Price
</HeaderTemplate>
<ItemTemplate>
<%# Container.DataItem( "UnitPrice" ) %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox
ID="txtUnitPrice"
Text='<%# Container.DataItem( "UnitPrice" )%>'
Runat="Server" />
<asp:RequiredFieldValidator
ControlToValidate="txtUnitPrice"
Display="Dynamic"
Text="Required!"
Runat="Server" />
<asp:CompareValidator
ControlToValidate="txtUnitPrice"
Display="Dynamic"
Text="Must be Currency!"
Operator="DataTypeCheck"
Type="Currency"
Runat="Server" />
</EditItemTemplate>
</asp:TemplateColumn>
<asp:EditCommandColumn
EditText="Edit!"
UpdateText="Update!"
CancelText="Cancel!" />
</Columns>
</asp:DataGrid>

</form>
</body>
</html>
J2ee_Goto 2005-05-13
  • 打赏
  • 举报
回复
真的有这样的asp服务器!!!
asp和asp.net服务器 50mb 25元/年
我看到了一个网站 50MB asp和 asp.net空间 现在促销,
同学们可以做一个简单的个人网站用来找工作 ,
支持 asp.net 一年才25元!不要错过哦!!!
速度非常快,一般公司企业 足够用了!
http://www.hi876.com 他们的IP 是 211.144.143.13 国务院-国研机房的!
希望能对大家有帮助
hubro 2005-05-13
  • 打赏
  • 举报
回复
没人看吗
hubro 2005-05-13
  • 打赏
  • 举报
回复
在这里可以看到效果
http://www.hubro.net/code/datagrid.aspx

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧