Ссылка на объект не установлена на экземпляр объекта при использовании FindControl

#c# #asp.net

#c# #asp.net

Вопрос:

Я использую следующий код.

файл .ascx:

 <div class="DemoArea">
    <asp:Button ID="btnCaseComplete" runat="server" Text="Case Complete" CssClass="btn_contentlist"
        onclick="btnCaseComplete_Click" OnClientClick="scroll(0,0);$.loading({mask: true, effect: 'ellipsis update'});"/>
       <ComponentArt:Dialog ID="caDropDownDialog" runat="server" Modal="true" Alignment="MiddleCentre" AllowDrag="true" AllowResize="false" AnimationDuration="1000" 
                            CloseTransition="Fade"  RenderOverWindowedObjects="true" ShowTransition="Fade" AnimationType="Outline" CssClass="ModalMask">
                            <Header><p class="header">Case Complete</p></Header>
                            <Content>
                                <asp:Panel ID="panSelectArea" runat="server" CssClass="modalMaskContent">

                                   <p><span class="red">Please Note:</span>Once you click
                                        <span class="bold">Ok</span>, your 
                                            case will be Submitted to ACR and you will not be able to edit the Case again. 

                                            <span class="style2">To continue editing the case, click </span>
                                            <span class="bold">Cancel</span>. You will be taken back 
                                            to the Case Wizard and your case will not be submitted to ACR.</p>
                                  </asp:Panel>
                            </Content>
                            <Footer>
                              <center class="modalMaskFooter">
                                    <asp:Button ID="btnOK" runat="server" CausesValidation="false" 
                                        CssClass="btn_contentlist" OnClientClick="caDropDownDialog.IsShowing=false" Text="OK" />
                                    <asp:Button ID="btnCancel" runat="server" CausesValidation="false" 
                                        CssClass="btn_contentlist" OnClientClick="caDropDownDialog.Close();" Text="Cancel" />
                                </center>
                            </Footer>
                        </ComponentArt:Dialog>
    </div>
  

Код, лежащий в основе:

 CaseContentList obj = new CaseContentList(); // creating the object of case content list control to this page

        LinkButton lbtn = (LinkButton)((DataList)obj.FindControl("dlstContentList")).FindControl("lbtnDisplay");
        if (lbtn.Text == "Final Page")
        {
            caDropDownDialog.IsShowing = true;
        }
        else
            Page.ClientScript.RegisterStartupScript(this.GetType(), "Window", "alert('Add Final Page First.');", true);
  

Но это выдает ошибку «ссылка на объект не установлена на экземпляр объекта».

Комментарии:

1. Это означает, что вы либо приводите его неправильно, либо ссылаетесь не на правильный объект, пожалуйста, вставьте свой aspx-код

2. Я думаю, что одно из ваших FindControl утверждений завершается ошибкой. Попробуйте добавить проверку на null перед использованием основанного элемента управления.

3. В каком событии вы вызываете этот код?

Ответ №1:

Это вызвано результатом одного из методов «FindControl()». Результатом является NULL, а не экземпляр элемента управления.

Необходимо проверить наличие null:

 bool found = false;
var dlstContentList = obj.FindControl("dlstContentList");
if ( null != dlstConentList ) {
   var lbtnDisplay = dlstContentList.FindControl("lbtnDisplay");
   found = (null != lbtnDisplay);
}

if ( found ) {
   // ... do something
}
else {
  // ... do something else
}
  

Комментарии:

1. Ситуация такая же. Вы, вероятно, запускаете код до создания элементов управления. Элементы управления создаются на этапе «Инициализации» страницы.

Ответ №2:

 CaseContentList cl = (CaseContentList)this.Parent.TemplateControl.FindControl("ContentList");
        if(cl.IsFinalPage)
            caDropDownDialog.IsShowing = true;
        else
          Page.ClientScript.RegisterStartupScript(this.GetType(), "Window", "alert('Please add Final Page to complete your case');", true);
  

Ответ №3:

Если это DataList, и вы ищете LinkButton, то я бы ожидал, что вам нужно будет перебрать каждый ListItem в DataList для того, который вы хотите, затем найдите элемент управления в этом ListItem

Для перебора ваших списков в DataList вы могли бы сделать это

 foreach (DataListItem dataListItem in obj.Items) {

if (dataListItem .ItemType == ListItemType.AlternatingItem | dl.ItemType == ListItemType.Item) {
        //
        // find the control here.
}
}
  

Комментарии:

1. не могли бы вы, плз, рассказать мне о цикле, как найти его с помощью цикла

2. проверьте отредактированный ответ. перебирает ваши DataListItems DATALISTISTITEMS