动态创建了一个calendar,然后在这个calendar中的某些单元格中又创建了textbox,如何找到这些textbox

时间:2021-04-16 00:59:33
我动态创建了一个calendar,然后在这个calendar中的某些单元格中又创建了textbox,如何找到这些textbox
由于页面中可能有多个calendar,我找到了calendar,但是却没办法用findcontrol找到任何一个textbox,这是为什么,谢谢大家看一下

13 个解决方案

#1


什么意思?干嘛要去找?

如果你从一些帖子上看到用“遍历Controls集合”的方法去遍历控件,我只能告诉你说你收农工当了,事情没有那么简单。

肯定是可以找到的,但是除非你是写asp.net底层系统(例如处理postback或者callback时的被触发对象),否则根本没有必要找。

当你创建Calendar的时候,把自己创建的TextBox保存起来,例如写入一个List<Control>,随时可以拿出来用。即使可以用 FindControl函数找到也不应该随便用。

#2


我现在的东西等于说是在一个动态生成的控件里面又动态生成了控件
楼上能给个简单点的例子吗,因为以前没试过这样做

#3


我说过了,道不同是很难回答的,别人不可能给你海阔天空地讲一大套东西而你仅仅想随机地捞一根稻草。你把你的设计思路说清楚,说明怎么样创建内部控件,又为什么要FindControl内部控件,别人才能在你的东西上指出问题。

#4


是这样的,客户有一样产品,这个产品的价格每天都变,而且他的出售日期不一定,例如这个产品是在2月1日到3月15日发布一次,然后再5月20日到8月10日发布一次,且每天价格不同,

那么我的考虑是按照日期动态生成calendar,一共是2月,3月,5月,6月,7月,8月6个,然后由于每天价格不同,那么2月1日到3月15日这段日期的单元格需要有一个textbox来存放价格,然后统一保存
生成calendar的部分代码
            For j = 1 To i + 1
                Dim Ccalendar As New Web.UI.WebControls.Calendar
                Ccalendar.ID = "Ccalendar" & rd("id") & j
                Ccalendar.VisibleDate = Year(rd("date_b")) & "-" & Month(rd("date_b")) + (j - 1) & "-1"
                Ccalendar.DayStyle.HorizontalAlign = HorizontalAlign.Left
                Ccalendar.DayStyle.VerticalAlign = VerticalAlign.Top
                Me.Panel1.Controls.Add(Ccalendar)
                AddHandler Ccalendar.DayRender, AddressOf Calendar_DayRender
            Next

添加textbox的代码
 Private Sub Calendar_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs)
        Dim Ccalendar As New Web.UI.WebControls.Calendar
        Ccalendar = sender
        Dim sqlconn As String
        Dim conn, connday As SqlClient.SqlConnection
        Dim cmd, cmdday As SqlClient.SqlCommand
        Dim rd, rdday As SqlClient.SqlDataReader
        Dim day_b, day_e
        Dim i As Integer

        Dim d, y As CalendarDay
        Dim c As TableCell
        d = e.Day
        c = e.Cell
        Dim list As ArrayList
        list = New ArrayList(Controls)

        'c.Controls.Add(New LiteralControl("<br><a href=FormMemosEdit.aspx>123</a>"))
        sqlconn = ConfigurationSettings.AppSettings("constring")
        conn = New SqlClient.SqlConnection(sqlconn)
        connday = New SqlClient.SqlConnection(sqlconn)
        conn.Open()



        cmd = New SqlClient.SqlCommand("select * from ddate where name='产品一' ", conn)
        rd = cmd.ExecuteReader
        Do While rd.Read

            If DateDiff(DateInterval.Day, d.Date, rd("date_b")) <= 0 And DateDiff(DateInterval.Day, d.Date, rd("date_e")) >= 0 Then

                Dim tb As New TextBox
                tb.ID = "tb" & Year(d.Date) & bool(Month(d.Date)) & bool(Day(d.Date))
                tb.Text = Now
                list.Add(tb)
                c.Controls.Add(New LiteralControl("<br>"))
                c.Controls.Add(tb)

            End If

        Loop

        conn.Close()
        '除去其他月份的日期
        If e.Day.IsOtherMonth Then
            e.Cell.Controls.Clear()
        End If

    End Sub

生成完以后我就要去找到每一个TEXTBOX里的内容来进行保存

#5


我写过这种代码...我用的是Lable,然后点击某个日期再进行修改.

#6


楼上你的calendar是动态生成的吗

#7


Q: 生成完以后我就要去找到每一个TEXTBOX里的内容来进行保存
——————————————————————————————————————————
A:这就清楚多了。我没有仔细看的程序,说一下思路:

你可以在页面类内定以一个集合;
    private TextBoxes as new List<TextBox>
然后将需要处理的TextBox放进去:
    list.Add(tb)
    TextBoxes.Add(tb)
这样在别的地方“for each”从这里找就行了。

在创建控件的时候,可以分门别类地把他们保存起来,后边其它事件里使用。只要页面处理没有结束,这些集合就都不会释放。

#8


private TextBoxes as new List(of TextBox)

好像是这样,呵呵,我VB.Net有点忘记了。

#9


谢谢楼上,有点思路了

#10


面向对象设计——很简单的技术,要仔细揣摩,对象是“独立”存在的活的东西。

你可以在后边的事件中对TextBoxes里边的某些TextBox拿出来“再进行加工”,这灵活的处理次序说明了“对象是独立的”提高了编程的方便性。

#11


应该还是不行,这跟控件加载的时机有关, DayRender事件甚至还在Page_PreRender之后, 这样回发数据加载不到上, 不但找不到控件(假设是点击button后寻找Textbox并保存它的值), 更取不到客户端提交的值

#12


好象的确是有点问题

#13


你是不是在winform里用吧,,
在web中用,好像不行吗

#1


什么意思?干嘛要去找?

如果你从一些帖子上看到用“遍历Controls集合”的方法去遍历控件,我只能告诉你说你收农工当了,事情没有那么简单。

肯定是可以找到的,但是除非你是写asp.net底层系统(例如处理postback或者callback时的被触发对象),否则根本没有必要找。

当你创建Calendar的时候,把自己创建的TextBox保存起来,例如写入一个List<Control>,随时可以拿出来用。即使可以用 FindControl函数找到也不应该随便用。

#2


我现在的东西等于说是在一个动态生成的控件里面又动态生成了控件
楼上能给个简单点的例子吗,因为以前没试过这样做

#3


我说过了,道不同是很难回答的,别人不可能给你海阔天空地讲一大套东西而你仅仅想随机地捞一根稻草。你把你的设计思路说清楚,说明怎么样创建内部控件,又为什么要FindControl内部控件,别人才能在你的东西上指出问题。

#4


是这样的,客户有一样产品,这个产品的价格每天都变,而且他的出售日期不一定,例如这个产品是在2月1日到3月15日发布一次,然后再5月20日到8月10日发布一次,且每天价格不同,

那么我的考虑是按照日期动态生成calendar,一共是2月,3月,5月,6月,7月,8月6个,然后由于每天价格不同,那么2月1日到3月15日这段日期的单元格需要有一个textbox来存放价格,然后统一保存
生成calendar的部分代码
            For j = 1 To i + 1
                Dim Ccalendar As New Web.UI.WebControls.Calendar
                Ccalendar.ID = "Ccalendar" & rd("id") & j
                Ccalendar.VisibleDate = Year(rd("date_b")) & "-" & Month(rd("date_b")) + (j - 1) & "-1"
                Ccalendar.DayStyle.HorizontalAlign = HorizontalAlign.Left
                Ccalendar.DayStyle.VerticalAlign = VerticalAlign.Top
                Me.Panel1.Controls.Add(Ccalendar)
                AddHandler Ccalendar.DayRender, AddressOf Calendar_DayRender
            Next

添加textbox的代码
 Private Sub Calendar_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs)
        Dim Ccalendar As New Web.UI.WebControls.Calendar
        Ccalendar = sender
        Dim sqlconn As String
        Dim conn, connday As SqlClient.SqlConnection
        Dim cmd, cmdday As SqlClient.SqlCommand
        Dim rd, rdday As SqlClient.SqlDataReader
        Dim day_b, day_e
        Dim i As Integer

        Dim d, y As CalendarDay
        Dim c As TableCell
        d = e.Day
        c = e.Cell
        Dim list As ArrayList
        list = New ArrayList(Controls)

        'c.Controls.Add(New LiteralControl("<br><a href=FormMemosEdit.aspx>123</a>"))
        sqlconn = ConfigurationSettings.AppSettings("constring")
        conn = New SqlClient.SqlConnection(sqlconn)
        connday = New SqlClient.SqlConnection(sqlconn)
        conn.Open()



        cmd = New SqlClient.SqlCommand("select * from ddate where name='产品一' ", conn)
        rd = cmd.ExecuteReader
        Do While rd.Read

            If DateDiff(DateInterval.Day, d.Date, rd("date_b")) <= 0 And DateDiff(DateInterval.Day, d.Date, rd("date_e")) >= 0 Then

                Dim tb As New TextBox
                tb.ID = "tb" & Year(d.Date) & bool(Month(d.Date)) & bool(Day(d.Date))
                tb.Text = Now
                list.Add(tb)
                c.Controls.Add(New LiteralControl("<br>"))
                c.Controls.Add(tb)

            End If

        Loop

        conn.Close()
        '除去其他月份的日期
        If e.Day.IsOtherMonth Then
            e.Cell.Controls.Clear()
        End If

    End Sub

生成完以后我就要去找到每一个TEXTBOX里的内容来进行保存

#5


我写过这种代码...我用的是Lable,然后点击某个日期再进行修改.

#6


楼上你的calendar是动态生成的吗

#7


Q: 生成完以后我就要去找到每一个TEXTBOX里的内容来进行保存
——————————————————————————————————————————
A:这就清楚多了。我没有仔细看的程序,说一下思路:

你可以在页面类内定以一个集合;
    private TextBoxes as new List<TextBox>
然后将需要处理的TextBox放进去:
    list.Add(tb)
    TextBoxes.Add(tb)
这样在别的地方“for each”从这里找就行了。

在创建控件的时候,可以分门别类地把他们保存起来,后边其它事件里使用。只要页面处理没有结束,这些集合就都不会释放。

#8


private TextBoxes as new List(of TextBox)

好像是这样,呵呵,我VB.Net有点忘记了。

#9


谢谢楼上,有点思路了

#10


面向对象设计——很简单的技术,要仔细揣摩,对象是“独立”存在的活的东西。

你可以在后边的事件中对TextBoxes里边的某些TextBox拿出来“再进行加工”,这灵活的处理次序说明了“对象是独立的”提高了编程的方便性。

#11


应该还是不行,这跟控件加载的时机有关, DayRender事件甚至还在Page_PreRender之后, 这样回发数据加载不到上, 不但找不到控件(假设是点击button后寻找Textbox并保存它的值), 更取不到客户端提交的值

#12


好象的确是有点问题

#13


你是不是在winform里用吧,,
在web中用,好像不行吗