我要疯了,一直着不到错误根源,请高手帮我分析一下,错在那里?

watercontainer 2004-04-29 09:37:38
我要疯了,一直着不到错误根源,请高手帮我分析一下,错在那里?


下面是一个网站程序(参考模板)的一部分。




//这是浏览器返回的错误信息


“/CommunityStarterKit”应用程序中的服务器错误。
--------------------------------------------------------------------------------

索引超出了数组界限。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.IndexOutOfRangeException: 索引超出了数组界限。

源错误:


行 175:
行 176: tw.RenderBeginTag(HtmlTextWriterTag.Td);
行 177: RenderDatePart(dateParts[1],tw);
行 178: tw.RenderEndTag();
行 179:


源文件: J:\ASP.NET精品全站程序SQL版\Engine\Modules\Events\Controls\DatePicker.cs 行: 177

堆栈跟踪:


[IndexOutOfRangeException: 索引超出了数组界限。]
ASPNET.StarterKit.Communities.DatePicker.Render(HtmlTextWriter tw) in J:\ASP.NET精品全站程序SQL版\Engine\Modules\Events\Controls\DatePicker.cs:177
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +241
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
System.Web.UI.Control.Render(HtmlTextWriter writer) +7
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +241
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
System.Web.UI.WebControls.WebControl.RenderContents(HtmlTextWriter writer) +7
System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) +29
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +241
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
System.Web.UI.Control.Render(HtmlTextWriter writer) +7
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +241
_ASP.Default_ascx.__Render__control1(HtmlTextWriter __output, Control parameterContainer) +685
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +27
System.Web.UI.Control.Render(HtmlTextWriter writer) +7
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +241
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer) +44
System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output) +262
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +241
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
System.Web.UI.Control.Render(HtmlTextWriter writer) +7
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +241
System.Web.UI.Page.ProcessRequestMain() +1912




--------------------------------------------------------------------------------
版本信息: Microsoft .NET Framework 版本:1.1.4322.573; ASP.NET 版本:1.1.4322.573












//这是出错程序的源代码



//
// DatePicker.cs
//

namespace ASPNET.StarterKit.Communities
{
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;

/// <summary>
/// Summary description for DatePicker.
/// </summary>
public class DatePicker : WebControl, INamingContainer
{


DropDownList dropMonth;
DropDownList dropDay;
DropDownList dropYear;
//SWS - Begin: Adding ability to specify the years to display within the datepicker control
int _yearsBefore = 5;
int _yearsAfter = 5;
//SWS - End: Adding ability to specify the years to display within the datepicker control

public int Month
{
get
{
if (ViewState["Month"] == null)
return DateTime.Now.Month;
else
return (int)ViewState["Month"];
}
set { ViewState["Month"] = value; }
}

public int Day
{
get
{
if (ViewState["Day"] == null)
return DateTime.Now.Day;
else
return (int)ViewState["Day"];
}
set { ViewState["Day"] = value; }
}

public int Year
{
get
{
if (ViewState["Year"] == null)
return DateTime.Now.Year;
else
return (int)ViewState["Year"];
}
set
{
ViewState["Year"] = value;
}
}

public DateTime Date
{
get
{
EnsureChildControls();

int _year = Int32.Parse(dropYear.SelectedItem.Value);
int _month = Int32.Parse(dropMonth.SelectedItem.Value);
int _day = Int32.Parse(dropDay.SelectedItem.Value);

if (_day > DateTime.DaysInMonth(_year, _month) )
throw new ArgumentException("Invalid date!");

return new DateTime
(
_year,
_month,
_day
);
}
set
{
Month = value.Month;
Day = value.Day;
Year = value.Year;
}
}

//SWS - Begin: Adding ability to specify the years to display within the datepicker control
public int YearsBefore
{
get { return _yearsBefore; }
set
{
if (value >= 0)
_yearsBefore = value;
}
}

public int YearsAfter
{
get { return _yearsAfter; }
set
{
if (value >= 0)
_yearsAfter = value;
}
}
//SWS - End: Adding ability to specify the years to display within the datepicker control


protected override void CreateChildControls()
{
dropMonth = new DropDownList();
Controls.Add(dropMonth);

dropDay = new DropDownList();
Controls.Add(dropDay);

dropYear = new DropDownList();
Controls.Add(dropYear);

if (!Page.IsPostBack)
{
// Get a DateTimeFormatInfo object
DateTimeFormatInfo objDateInfo = DateTimeFormatInfo.CurrentInfo;

// Display Months
for (int i=1;i<objDateInfo.MonthNames.Length;i++)
dropMonth.Items.Add(new ListItem(objDateInfo.GetMonthName(i), i.ToString()));

// Display Days
for (int i=1;i<32;i++)
dropDay.Items.Add(i.ToString());

// Display Years
//SWS - Begin: Adding ability to specify the years to display within the datepicker control
for (int i=DateTime.Now.Year - YearsBefore;i<=DateTime.Now.Year + YearsAfter;i++)
dropYear.Items.Add(i.ToString());
//SWS - End: Adding ability to specify the years to display within the datepicker control


dropMonth.Items.FindByValue(Month.ToString()).Selected = true;
dropDay.Items.FindByValue(Day.ToString()).Selected = true;
dropYear.Items.FindByValue(Year.ToString()).Selected = true;
}

}


protected override void Render(HtmlTextWriter tw)
{
// Get Date Parts
string[] dateParts;
try
{
DateTimeFormatInfo objDateInfo = DateTimeFormatInfo.CurrentInfo;

dateParts = objDateInfo.ShortDatePattern.Split('/');
}
catch
{
dateParts = new string[]{"m","d","y"};
}

tw.RenderBeginTag(HtmlTextWriterTag.Table);
tw.RenderBeginTag(HtmlTextWriterTag.Tr);
tw.RenderBeginTag(HtmlTextWriterTag.Td);
RenderDatePart(dateParts[0],tw);
tw.RenderEndTag();

tw.RenderBeginTag(HtmlTextWriterTag.Td);
RenderDatePart(dateParts[1],tw); //line 177
tw.RenderEndTag();

tw.RenderBeginTag(HtmlTextWriterTag.Td);
RenderDatePart(dateParts[2],tw);
tw.RenderEndTag();

tw.RenderEndTag(); // close row
tw.RenderEndTag(); // close table


}


private void RenderDatePart(string datePart,HtmlTextWriter tw)
{
datePart = datePart.ToLower();

if (datePart.StartsWith("m"))
dropMonth.RenderControl(tw);
else
if (datePart.StartsWith("d"))
dropDay.RenderControl(tw);
else
dropYear.RenderControl(tw);
}



}
}
...全文
100 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
godblessyU 2004-05-03
  • 打赏
  • 举报
回复
太长了!
shareworld 2004-05-03
  • 打赏
  • 举报
回复
这种问题你用VS.Net带的跟踪调试工具,一下子就可以搞定啊
draclosta 2004-05-03
  • 打赏
  • 举报
回复
看错误类型应该是索引越界的错误,仔细看一下数组的引用吧.
gucao 2004-05-03
  • 打赏
  • 举报
回复
数组越界了,比方说你 string [] data=new string[3];
但是下文中有 data[3]或data[n] (n>3)就会报错。
marvelstack 2004-05-03
  • 打赏
  • 举报
回复
楼主调试一下,看看具体是在哪一行抛出异常。
turnmissile 2004-05-03
  • 打赏
  • 举报
回复
sign.
whalefish2001 2004-05-02
  • 打赏
  • 举报
回复
太长,帮你顶回去。
都跑到第3页来了。
lagger 2004-05-02
  • 打赏
  • 举报
回复
好像你的DataParts没有定义(没有分配空间,就是没有告诉它它是多个个的数组),
string[] dateParts改为string[] dateParts=new string[3],在catch里把new 去掉看看.
ssunday 2004-05-02
  • 打赏
  • 举报
回复
建议为程序设置断点,逐步执行,能去到下一个断点的说明当前断点之前的代码都没有问题,这样逐渐缩小范围,直至确定出错的语句为止
wellsmith 2004-05-02
  • 打赏
  • 举报
回复
太长了!
michaelowenii 2004-05-01
  • 打赏
  • 举报
回复
我看不完,太长.^_^
bitsbird 2004-04-29
  • 打赏
  • 举报
回复
真的头晕,应该是0,1,2和1,2,3的问题
cuike519 2004-04-29
  • 打赏
  • 举报
回复
try
{
DateTimeFormatInfo objDateInfo = DateTimeFormatInfo.CurrentInfo;

dateParts = objDateInfo.ShortDatePattern.Split('/');
}
catch
{
dateParts = new string[]{"m","d","y"};
}
这里面try里面应该是没有错误但是dateParts的维数应该不到3!你好好检查一下objDateInfo.ShortDatePattern的内容!这里面的内容你能帖出来看看吗?

objDateInfo.ShortDatePattern这里面可能只有一个“/“吧!!!所以在前面引用dateParts[0]的时候没有错,而dateParts[1]时候出错!
wangsaokui 2004-04-29
  • 打赏
  • 举报
回复
头都晕了,你调试看看你的数组值是多少
RenderDatePart(dateParts[1],tw);

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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