2010-08-03 143 views
1

我想从DataList的EditItemTemplate访问一个webcontrol(一个Textbox),所以我可以改变它。当我尝试执行DataList.FindControl(“TextboxID”)时,它会返回null,因为它无法识别已呈现的文本框。我试过在DataBinding,DataBound事件中寻找,而那些也不起作用。ASP.NET:从DataList中的EditItemTemplate访问WebControl

更具体地说,我需要在用户使用Calendar控件时更改文本框的值,所以我需要从Calendar_SelectionChanged事件中的EditItemTemplate访问控件。

任何人有任何想法或解决方法?谢谢!

代码:

protected void calendar1_SelectionChanged(object sender, EventArgs e) 
{ 
    // Access EditItemTemplate Control 
} 


<asp:DataList ID="DataListMaintenance" runat="server" 
             oncancelcommand="DataListMaintenance_CancelCommand" 
             oneditcommand="DataListMaintenance_EditCommand" 
             onupdatecommand="DataListMaintenance_UpdateCommand" 
             DataSourceID = "LMMaintDataSource" 
             ondeletecommand="DataListMaintenance_DeleteCommand"> 
            <EditItemTemplate> 
             <table width = "100%" cellpadding = "2" cellspacing = "1"> 
              <tr> 
               <td valign = "top"> 
                <b>Contract Start Date:</b> 
               </td> 
               <td> 
                <asp:TextBox ID="txtContractStart" runat="server" Text = '<%# Bind("ContractStartDate") %>'></asp:TextBox> 
                <% if (!calDateEdit.Visible) 
                 { %> 
                <asp:LinkButton ID="linkChoose" runat="server" onclick="linkChoose2_Click">Choose</asp:LinkButton> 
                <%} %> 
                <% if (calDateEdit.Visible) 
                 { %> 
                <asp:LinkButton ID="linkCancel" runat="server" onclick="linkCancel2_Click">Cancel</asp:LinkButton> 
                <%} %> 
               </td> 
               <td> 
                <asp:Calendar ID="calDateEdit" runat="server" Visible ="false" 
            onselectionchanged="calendar1_SelectionChanged"> 
            <SelectedDayStyle BorderColor="Blue" BorderStyle="Solid" /> 
           </asp:Calendar> 
               </td> 
              </tr> 
              <tr> 
               <td> 
                <asp:Button ID="cmdUpdate" runat="server" Text="Update" CommandName = "Update" />&nbsp;<asp:Button ID="cmdCancel" runat="server" Text="Cancel" CommandName = "Cancel" /> 
               </td> 
              </tr> 
             </table> 
            </EditItemTemplate> 
            <ItemTemplate> 
             <table width = "100%" cellpadding = "2" cellspacing = "1"> 
              <tr> 
               <td valign = "top"> 
                <b>Contract Start Date:</b> 
               </td> 
               <td> 
                <asp:Label ID="lblStart" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "ContractStartDate")%>'></asp:Label> 
               </td> 
              </tr> 
             </table> 
            </ItemTemplate> 
            </asp:DataList> 

回答

0

您有肉眼可见= FALSE您calDateEdit。你是否在任何地方设置它为真?它不会被渲染。

+0

是的,当我点击旁边的“选择”按钮时,我将其设置为true。 protected void linkChoose2_Click(object sender,EventArgs e){//如果可见,则隐藏其他日历如果(calDateEdit.Visible){calDatEdit.Visible = false; } calDateEdit.Visible = true; } – Confused 2010-08-03 15:23:57

0

这不是世界上最干净的东西,但我设法通过在“编辑模式”中加载我的页面来获得它,以便我想更改的文本框可见。然后做一个右键单击 - >查看源,然后滚动到我的文本框,并得到它的ID,看起来像这样:“ctl00 $ Content $ DataList $ ctl00 $ txtContractStart”

然后,我做了下面的代码在我的日历选择更改事件中:

TextBox txtContract = (TextBox)Page.FindControl("ctl00$Content$DataList$ctl00$txtContractStart"); 

此代码成功找到文本框。我希望这可以帮助别人。