views:

990

answers:

1

I am creating a custom checkbox control to add a div after each checkbox in a checkboxlist. The class is below.

Imports System.Web.UI.WebControls
Imports System.ComponentModel
Imports System.Globalization

Public Class MyCheckboxListCheckBox
    Inherits CheckBoxList
    Implements IRepeatInfoUser
    Protected Overrides Sub RenderItem(ByVal itemType As ListItemType, ByVal repeatIndex As Integer, ByVal repeatInfo As RepeatInfo, ByVal writer As HtmlTextWriter)

        writer.WriteBeginTag("input")
        writer.WriteAttribute("type", "checkbox")
        writer.WriteAttribute("name", UniqueID)
        writer.WriteAttribute("id", (ClientID & "_") + repeatIndex.ToString(NumberFormatInfo.InvariantInfo))
        writer.WriteAttribute("value", Items(repeatIndex).Value)
        Dim attrs As System.Web.UI.AttributeCollection = Items(repeatIndex).Attributes
        For Each key As String In attrs.Keys
            writer.WriteAttribute(key, attrs(key))
        Next
        writer.Write(">")

        writer.Write(Items(repeatIndex).Text)
        ' writer.Write("<div id=" & "mynewDiv" & Items(repeatIndex).Value & "></div>")


    End Sub



End Class

But I get an error when i use it in a page and call the save. The error is :

startIndex cannot be larger than length of string. Parameter name: startIndex Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentOutOfRangeException: startIndex cannot be larger than length of string. Parameter name: startIndex

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[ArgumentOutOfRangeException: startIndex cannot be larger than length of string. Parameter name: startIndex]
System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy) +7492915
System.Web.UI.WebControls.CheckBoxList.LoadPostData(String postDataKey, NameValueCollection postCollection) +60
System.Web.UI.WebControls.CheckBoxList.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +13
System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +346
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1743

Any ideas ?

A: 

Place a breakpoint on your overrides renderItem function declaration. Start your project using VS debugging mode and trace what variables are set and to what. I have a feeling that you are using a startindex of 1 on an empty string somewhere. Remember, arrays and such start at 0.

Tommy