2016-04-26 245 views
1

我正在尝试查找连接到母版页的网页上的控件。控件本身位于内容页面上,这应该是一件简单的事情,但是无论我使用什么方法,每次都会返回null。无法在页面母版页上找到控件

在这两行其崩溃和说该参数不能为空

文本框txtSubjectNotes =(文本框)item.FindControl( “txtSubjectNotes”);

TextBox txtMultiNotes =(TextBox)item.FindControl(“txtMultiNotes”);

而我在它下面标记为这两个控件,而我正在试图访问

<telerik:RadTextBox ID="txtSubjectNotes" Width="200px" runat="server"></telerik:RadTextBox>             
<telerik:RadTextBox ID="txtMultiNotes" TextMode="MultiLine" Rows="10" Columns="10" Width="200px" runat="server"></telerik:RadTextBox> 

任何帮助在能够asolve这将是伟大的,不,这不是具体到Telerik控制这是能够在页面上找到控件的标准.net代码。

<telerik:RadAjaxPanel ID="rpNotes" runat="server" LoadingPanelID="RadAjaxLoadingPanel1" > 

          <telerik:RadGrid ID="rgNotes" runat="server" GroupPanelPosition="Top" OnItemCommand="rgNotes_ItemCommand" > 
           <GroupingSettings CollapseAllTooltip="Collapse all groups"></GroupingSettings> 
           <MasterTableView NoDetailRecordsText="No notes for this Appointment" AutoGenerateColumns="False" DataKeyNames="notes_id" CommandItemDisplay="Top" CommandItemSettings-AddNewRecordText="Add Notes" AllowAutomaticInserts="true" EditMode="PopUp"> 
            <Columns> 
             <telerik:GridEditCommandColumn UniqueName="EditCommandColumn"> 
             </telerik:GridEditCommandColumn> 
             <telerik:GridBoundColumn DataField="notes_id" FilterControlAltText="Filter notes_id column" HeaderText="notes_id" ReadOnly="True" SortExpression="notes_id" Visible="true" UniqueName="notes_id"> 
             </telerik:GridBoundColumn> 
             <telerik:GridBoundColumn DataField="Subject" FilterControlAltText="Filter Subject column" HeaderText="Subject" ReadOnly="True" SortExpression="Subject" UniqueName="Subject"> 
             </telerik:GridBoundColumn> 
            </Columns> 

            <EditFormSettings EditFormType="Template" InsertCaption="Add new Note" CaptionFormatString="Please enter or update note"> 
             <FormTemplate> 

              <telerik:RadTextBox ID="txtNotesId" Visible="false" Width="200px" runat="server"></telerik:RadTextBox> 

              Subject 
              <p> 
               <telerik:RadTextBox ID="txtSubjectNotes" Width="200px" runat="server"></telerik:RadTextBox> 
              </p> 
              <p> 
               Notes<br /> 
               <telerik:RadTextBox ID="txtMultiNotes" TextMode="MultiLine" Rows="10" Columns="10" Width="200px" runat="server"></telerik:RadTextBox> 
              </p> 

              <telerik:RadButton ID="rdSaveNotes" OnClick="rdSaveNotes_Click" Skin="Bootstrap" BackColor="#512479" ForeColor="White" runat="server" Text="Save Notes"></telerik:RadButton> 
              <telerik:RadButton ID="rdCancel" OnClick="rdCancel_Click1" CommandName="Cancel" Skin="Bootstrap" BackColor="#512479" ForeColor="White" runat="server" Text="Cancel"></telerik:RadButton> 
             </FormTemplate> 
            </EditFormSettings> 
           </MasterTableView> 
           <ClientSettings> 
            <ClientEvents OnPopUpShowing="PopUpShowing" /> 
            <Selecting AllowRowSelect="true" /> 
           </ClientSettings> 
          </telerik:RadGrid> 
         </telerik:RadAjaxPanel> 

protected void rdSaveNotes_Click(object sender, EventArgs e) 
{ 
    try 
    { 
    int id = Convert.ToInt32(Request.QueryString["id"]); 
    tblApertureNetNote _note = new tblApertureNetNote(); 

    _note = _dal.GetNotesById(new Guid(notes_id),_myuser.UserId); 

    _note.appointment_id = id; 
    _note.authUserId = _myuser.UserId; 
    _note.isActive = true; 
    _note.isDeleted = false; 

    var editFormItems = rgNotes.MasterTableView.GetItems(GridItemType.EditFormItem); 

    foreach (GridEditFormItem item in editFormItems) 
    { 
     if (!item.IsInEditMode) 
     { 
      continue; 
     } 

     TextBox txtSubjectNotes = (TextBox)item.FindControl("txtSubjectNotes"); 
     TextBox txtMultiNotes = (TextBox)item.FindControl("txtMultiNotes"); 
     //add custom logic here 


     _note.note = txtMultiNotes.Text; 


     _note.subject = txtSubjectNotes.Text; 

    } 
    if (_note.EntityState == System.Data.EntityState.Detached) 
     _dal.Addnotes(_note); 

    rgNotes.DataBind(); 
} 
catch (Exception ex) 
{ 
    logger.Error("Error in rdSaveNotes_Click function calandar edit.aspx" + ex.ToString()); 
} 
} 

感谢下面的评论由mig。这个方法我试过和它发现它,但它蒙上一个人如何实习生强制转换成文本框中键入它作为控制这是contorl被即时试图找到这个应该是什么难

public static Control FindControlRecursive(this Control control, string id) 
{ 
    if (control == null) return null; 
    //try to find the control at the current level 
    Control ctrl = control.FindControl(id); 

    if (ctrl == null) 
    { 
     //search the children 
     foreach (Control child in control.Controls) 
     { 
      ctrl = FindControlRecursive(child, id); 

      if (ctrl != null) break; 
     } 
    } 
    return ctrl; 
} 

即怎么办我投这行到一个文本框?

Control ctrl = this.FindControlRecursive("my_control_id"); 

编辑2

行,所以我都试过,但现在我得到

{ “未将对象引用设置到对象的实例。”}

RadTextBox ctrl = (RadTextBox)this.FindControlRecursive("txtSubjectNotes"); 
       RadTextBox myControl; 
       if (ctrl is RadTextBox) 
       { 
        myControl = (RadTextBox)this.FindControlRecursive("txtSubjectNotes"); 


        // _note.note = txtMultiNotes.Text; 


        _note.subject = myControl.Text; 
       } 
+0

感谢您的投票上有家伙 – rogue39nin

+0

我认为你需要使用递归查找。 http://stackoverflow.com/questions/4955769/better-way-to-find-control-in-asp-net – mlg

+0

@mig谢谢你的工作,但看看我的新意见上面,请看看你是否可以回答这个问题给你的荣誉 – rogue39nin

回答

0

使用递归控制查找查找cont rol Recursive control lookup 要么你可以做直接演员。
Control ctrl = (TextBox)this.FindControlRecursive("my_control_id");

或者您可以在检查控件类型后进行强制转换。

TextBox myControl; 
If(ctrl is TextBox) 
    myControl = (TextBox)this.FindControlRecursive("my_control_id"); 
+0

当我尝试RadTextBox myControl =(RadTextBox)this.FindControlRecursive(“txtSubjectNotes”); 我得到的错误 错误\t CS1023 \t嵌入式声明不能是声明或标记语句\t ApertureNet \t C:\ Projects \ calendar \ ApertureNet \ ApertureNet \ Account \ modules \ calendar \ edit.aspx。cs 有效 – rogue39nin

+0

@mig仍然是相同的errror dam为什么这很难像 – rogue39nin

+0

@mig得到这仍然在此值不能为空。 参数名称:g是找到控制方法的原因 – rogue39nin