【问题标题】:Not Being able to find control on page master page无法在页面母版页上找到控件
【发布时间】: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 请看看你是否能回答这个问题来给你荣誉
  • 请看我的回答。

标签: c# asp.net telerik


【解决方案1】:

使用递归控件查找控件 Recursive control lookup 要么你可以直接投。
Control ctrl = (TextBox)this.FindControlRecursive("my_control_id");

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

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

【讨论】:

  • 当我尝试 RadTextBox myControl = (RadTextBox)this.FindControlRecursive("txtSubjectNotes");我收到错误错误 CS1023 Embedded statement cannot be a declaration or labelled statement ApertureNet C:\Projects\calendar\ApertureNet\ApertureNet\Account\modules\calendar\edit.aspx.cs 223 Active
  • @mig 还是一样的错误坝为什么这么难像
  • @mig 仍然在这个值上不能为空。参数名称:g 是 find 控制方法的原因
  • @mig 任何想法,因为问题仍未得到满足
  • 经过第一个 findrescurve 之后
猜你喜欢
  • 2011-04-12
  • 2012-05-18
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多