1

ページでグローバル変数としてリストを作成しました。

public static List<LinkButton> allControlsLinkButtonSalles = new List<LinkButton>();

during と呼ばれる関数ではPage_Load、次のような要素をいくつか追加します。

foreach (var childControl in allControlsLinkButton)
{
    if (childControl.CssClass == "linkButtonSalleActive" ||  childControl.CssClass == "linkButtonSalle")
    {
        allControlsLinkButtonSalles.Add(childControl);
    }
}

その直後、これを行うと:

foreach (LinkButton value in allControlsLinkButtonSalles)
{
    literal2.Text += " <br /> Text " + value.Text;
}

そして、必ず3つの要素が現れます。ただし、これを実行しようとすると:

literal2.Text += " First element " + allControlsLinkButtonSalles.First().Text;

エラーが発生します。なぜそれが可能ですか?

メッセージは次のとおりです。

説明 : 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.InvalidOperationException: シーケンスに要素が含まれていません。

ソース エラー:

ライン 605 : } ライン 606 : ライン 607 :literal2.Text += "First" + allControlsLinkBut​​tonSalles.First().Text; ライン 608 : ライン 609 : //allControlsLinkBut​​tonSalles[0].CssClass = "linkBut​​tonSalleActive"; スタックトレース:

[InvalidOperationException: シーケンスに要素が含まれていません。] System.Linq.Enumerable.First (IEnumerable `1 source) +269 test2MasterPage.Page_init() in c:\Users....\Documents\Visual Studio 2012\WebSites\test1\ test2MasterPage.aspx.cs:607 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(オブジェクト送信者、EventArgs e) +9807957 System.Web.UI.Control.OnInit(EventArgs e) +92 System.Web.UI.Page.OnInit( EventArgs e) +12 System.Web.UI.Control.InitRecursive(コントロールの名前付けコンテナー) +134 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +489

完全なコードは次のとおりです。

public static List<DataTable> ListTable = new data().GetTable();
public static List<string> SallesList = new data().SallesListCreation(ListTable[0]);

//DataTable dt = new data().
public static int Load_Counter = 0;
List<Button> allControlsButton = new List<Button>();
public static List<LinkButton> allControlsLinkButtonSalles = new List<LinkButton>();

List<LinkButton> allControlsLinkButtonAffichages = new List<LinkButton>();
List<LinkButton> allControlsLinkButtonSemaine = new List<LinkButton>();

protected void Page_Load(object sender, EventArgs e)
{
    literal2.Text += "<br /> counter : " + Load_Counter.ToString();
    DateTime today = DateTime.Now;
    string sToday = DateTime.Now.ToString("dd/MM/yyyy");
    string finDate = today.AddDays(+6).ToString("dd/MM/yyyy");
    literaltest.Text = "Semaine du " + sToday + " au " + finDate;

    PlaceHolder1.Controls.Add(new LiteralControl("<br /><br /><br /> kyofu<br /><br />"));

    foreach (string sallesel in SallesList)
    {
        PlaceHolder1.Controls.Add(CreateLinkButton(sallesel + "lkbtn", sallesel, "linkButtonSalle"));
    }

    Page_init();
}

protected void Page_init()
{
    List<LinkButton> allControlsLinkButton = new List<LinkButton>();
    GetControlList<LinkButton>(Page.Controls, allControlsLinkButton);
    DateTime today = DateTime.Now;
    string sToday = DateTime.Now.ToString("dd/MM/yyyy");

    // the list of controllers is filled
    foreach (var childControl in allControlsLinkButton)
    {
        if (childControl.CssClass == "linkButtonSalleActive" ||  childControl.CssClass == "linkButtonSalle")
        {
            allControlsLinkButtonSalles.Add(childControl);
            literal2.Text += " allControlsLinkButtonSalles " + childControl.Text;
        }

        if (childControl.CssClass == "linkButtonAffichage" ||  childControl.CssClass == "linkButtonAffichageActive")
        {
            allControlsLinkButtonAffichages.Add(childControl);
        }
        if (childControl.CssClass == "linkButtonSemaine" || childControl.CssClass == "linkButtonSemaineActive")
        {
            allControlsLinkButtonSemaine.Add(childControl);
            SemaineSync(childControl);
        }
    }
    literal2.Text += " taille " + allControlsLinkButtonSalles.Count();
    //literal2.Text += " Text " + allControlsLinkButtonSalles[1].Text;

    foreach (LinkButton value in allControlsLinkButtonSalles)
    {
        literal2.Text += " <br /> Text " + value.Text;
    }

    literal2.Text += " First " + allControlsLinkButtonSalles.First().Text;
    ListFilmsBySalle(SallesList[0]);
}

private void GetControlList<T>(ControlCollection controlCollection, List<T> resultCollection)
where T : Control
{
    foreach (Control control in controlCollection)
    {
        //if (control.GetType() == typeof(T))
        if (control is T) // This is cleaner
            resultCollection.Add((T)control);

        if (control.HasControls())
            GetControlList(control.Controls, resultCollection);
    }
}
4

4 に答える 4

0

static キーワードを適切に使用していません。静的変数は、クラス自体に属しており、現在のインスタンスには属していません。

使用してみてください:

   public List<LinkButton> allControlsLinkButtonSalles
   {
       get
       {
           if(Session["allControlsLinkButtonSalles"] == null)
               Session["allControlsLinkButtonSalles"] = new List<LinkButton>();
           return (List<LinkButton>) Session["allControlsLinkButtonSalles"];

       }
       set
       {
           Session["allControlsLinkButtonSalles"] = value;
       }
   }

確認すべきもう 1 つの問題は、実際に何かがリストに入力され、それをデバッグしようとすることです。

于 2013-08-09T11:00:08.437 に答える
0

あなたのコードに従って、値がリスト allControlsLinkButtonSallesに追加されるのはchildControl.CssClass == "linkButtonSalleActive"

追加される価値はないと確信しています。あなたが得ているものを確認してくださいliteral2.Text:- literal2.Text += " taille "+ allControlsLinkButtonSalles .Count();

正当な理由がない限り、ページで静的変数またはプロパティを使用しないでください。

于 2013-08-26T09:18:57.970 に答える
0
Create a Static Class and Create some Attributes and Set your Values to those     

Attributes their Whenever you Want you can take it from their if Data has any change 

Again set those attributes so that you will get your data from the Class

Public static class Helper
     {
        public string SOMEPROPERTY
          {
             get;
             set;
          }
              .
              .
              .

        public List<LinkButton> SOMEPROPERTY
          {
             get;
             set;
          }


      }              
于 2013-08-09T12:09:45.130 に答える
0

Got the same error as you at first, realised I had no controls in the List you are looking at because I had no LinkButton s with either of the classes that were being searched for with regard to the allControlsLinkButtonSalles list.

ページ上のすべてのLinkbutton Sに「linkbuttonsallecoctive」のCSSClassを追加しましたが、デバッグエラーはありませんでした。

Salle固有のリンクがない場合は、リストが実際には空であることを確認してください。問題はありません。

私が使用したサンプルコードは次のとおりです。

デフォルト.aspx

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label runat="server" id="literal2" /> <br />
        <asp:Label runat="server" id="literaltest" /> <br />
        <asp:LinkButton runat="server" CssClass="linkButtonSalleActive" text="1"/>
        <asp:LinkButton runat="server" CssClass="linkButtonSalleActive" text="2"/>
        <asp:LinkButton runat="server" CssClass="linkButtonSalleActive" text="3"/>
        <asp:LinkButton runat="server" CssClass="linkButtonSalleActive" text="4"/>
    </div>
    </form>
</body>
</html>

Default.aspx.cs (完全なコードの修正版)

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        //DataTable dt = new data().
        public static int Load_Counter = 0;
        List<Button> allControlsButton = new List<Button>();
        public static List<LinkButton> allControlsLinkButtonSalles = new List<LinkButton>();

        List<LinkButton> allControlsLinkButtonAffichages = new List<LinkButton>();
        List<LinkButton> allControlsLinkButtonSemaine = new List<LinkButton>();

        protected void Page_Load(object sender, EventArgs e)
        {
            literal2.Text += "<br /> counter : " + Load_Counter.ToString();
            DateTime today = DateTime.Now;
            string sToday = DateTime.Now.ToString("dd/MM/yyyy");
            string finDate = today.AddDays(+6).ToString("dd/MM/yyyy");
            literaltest.Text = "Semaine du " + sToday + " au " + finDate;

            //PlaceHolder1.Controls.Add(new LiteralControl("<br /><br /><br /> kyofu<br /><br />"));

            //foreach (string sallesel in SallesList)
            //{
            //    PlaceHolder1.Controls.Add(CreateLinkButton(sallesel + "lkbtn", sallesel, "linkButtonSalle"));
            //}

            Page_init();
        }

        protected void Page_init()
        {
            List<LinkButton> allControlsLinkButton = new List<LinkButton>();
            GetControlList<LinkButton>(Page.Controls, allControlsLinkButton);
            DateTime today = DateTime.Now;
            string sToday = DateTime.Now.ToString("dd/MM/yyyy");

            // the list of controllers is filled
            foreach (var childControl in allControlsLinkButton)
            {
                if (childControl.CssClass == "linkButtonSalleActive" || childControl.CssClass == "linkButtonSalle")
                {
                    allControlsLinkButtonSalles.Add(childControl);
                    literal2.Text += " allControlsLinkButtonSalles " + childControl.Text;
                }

                if (childControl.CssClass == "linkButtonAffichage" || childControl.CssClass == "linkButtonAffichageActive")
                {
                    allControlsLinkButtonAffichages.Add(childControl);
                }
                if (childControl.CssClass == "linkButtonSemaine" || childControl.CssClass == "linkButtonSemaineActive")
                {
                    allControlsLinkButtonSemaine.Add(childControl);
                    //SemaineSync(childControl);
                }
            }
            literal2.Text += " taille " + allControlsLinkButtonSalles.Count();
            //literal2.Text += " Text " + allControlsLinkButtonSalles[1].Text;

            foreach (LinkButton value in allControlsLinkButtonSalles)
            {
                literal2.Text += " <br /> Text " + value.Text;
            }

            /*
             * CHANGES HERE
             */

            literal2.Text += allControlsLinkButtonSalles.Count > 0 ?
                " First " + allControlsLinkButtonSalles.First().Text :
                String.Empty;
            //ListFilmsBySalle(SallesList[0]);
        }

        private void GetControlList<T>(ControlCollection controlCollection, List<T> resultCollection)
        where T : Control
        {
            foreach (Control control in controlCollection)
            {
                //if (control.GetType() == typeof(T))
                if (control is T) // This is cleaner
                    resultCollection.Add((T)control);

                if (control.HasControls())
                    GetControlList(control.Controls, resultCollection);
            }
        }
    }
}
于 2013-08-09T15:14:20.200 に答える