【发布时间】:2016-04-26 10:20:33
【问题描述】:
我正在尝试在附加到母版页的网页上查找控件。控件本身位于内容页面上,这应该是一件简单的事情,但无论我使用什么方法,每次都会返回 null。
在这两行它崩溃并说参数不能为空
文本框 txtSubjectNotes = (TextBox)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>
任何能够解决这个问题的帮助都很好,不,这不是 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 在下面的评论。我尝试了这种方法,它找到了它,但它把它的类型转换为控制一个实习生如何将它转换为文本框,这是我试图找到的控件,这应该很难
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;
}
【问题讨论】:
-
感谢大家的投票
-
我认为你需要使用递归查找。 stackoverflow.com/questions/4955769/…
-
@mig 谢谢你的工作,但看看我的新 cmets 请看看你是否能回答这个问题来给你荣誉
-
请看我的回答。