Странная проблема компиляции при добавлении динамического контроля рейтинга - PullRequest
0 голосов
/ 18 апреля 2011

Я использую ajax controlkit для динамического добавления ratingcontrols к определенному столбцу предопределенной таблицы, причем максимальное значение этого элемента управления зависит от столбца перед ним.

В любом случае, при использовании динамических элементов управления я узнал,что вы должны повторно добавлять их каждый раз при загрузке страницы, поэтому я добавил переменную Session, которая позволяет мне - когда страница не загружается в первый раз И это логическое значение true - добавить эти элементы управления рейтингом вместе с их событием (изменено) обрабатывается обработчиком событий на этой странице.

Это 2 блока кода, которые обрабатывают рейтинговые события и динамическое добавление в столбец таблицы:

  1. Событие

    protected void Page_Load(object sender, EventArgs e)
    {
    
    if (!Page.IsPostBack)
    {
        ScriptManager1.RegisterAsyncPostBackControl(imbGebruikers);
        ScriptManager1.RegisterAsyncPostBackControl(imbModellen);
        imbvolgende.Enabled = true;
        ddlGebruikers.Items.Add(new ListItem("", ""));
        String ingelogdegebruikerid = (String)Session["gebruikerid"];
        lbl1.Text = "Evaluator : " + Database.geefGebruikerNaam(ingelogdegebruikerid);
    
        IEnumerator<EvaluatieFormulier> evaluatieformulieren = Database.laadFormulierenIn().GetEnumerator();
        List<EvaluatieFormulier> mijnformulieren = new List<EvaluatieFormulier>();
        Session["mijnformulieren"] = mijnformulieren;
        while (evaluatieformulieren.MoveNext())
        {
            if (((evaluatieformulieren.Current.GebruikerevaluatorID.ToString() == ingelogdegebruikerid) && (evaluatieformulieren.Current.Afgewerkt == "nee")))
                mijnformulieren.Add(evaluatieformulieren.Current);
        }
    
        IEnumerator<EvaluatieFormulier> mijnenumerator = mijnformulieren.GetEnumerator();
        while (mijnenumerator.MoveNext())
        {
            String geevalueerdenaam = Database.geefGebruikerNaam(mijnenumerator.Current.GebruikergeevalueerdID);
            Boolean ziteralin = false;
            foreach (ListItem item in ddlGebruikers.Items)
            {
                if (item.Text == geevalueerdenaam)
                    ziteralin = true;
            }
            if (!ziteralin)
                ddlGebruikers.Items.Add(new ListItem(geevalueerdenaam, mijnenumerator.Current.GebruikergeevalueerdID));
        }
        imbFormulier.Visible = false;
    
        Session["formulieractief"] = false;
    }
    else
    {
        //Re-add the rating controls to my table IF the page is not being loaded for the first time && this boolean is true(the table is being shown)
        Boolean formulieractief = (Boolean)Session["formulieractief"];
    
        if (formulieractief)
        {
            Evaluatieform mijnform = (Evaluatieform)Session["formulier"];
            List<DomeinsCriteriums> domeincontrolenum = mijnform.controls;
            AjaxControlToolkit.Rating dynamischeratingcontrol = new AjaxControlToolkit.Rating();
            dynamischeratingcontrol.FilledStarCssClass = "filledRatingStar";
            dynamischeratingcontrol.EmptyStarCssClass = "emptyRatingStar";
    
            foreach (DomeinsCriteriums domeincontrol in domeincontrolenum)
            {
                foreach (CriteriumLijn criteriumcontrol in domeincontrol.Criterias)
                {
                    ScriptManager1.RegisterAsyncPostBackControl(dynamischeratingcontrol);
                    dynamischeratingcontrol.ID = criteriumcontrol.Criterium.CriteriumNaam;
                    dynamischeratingcontrol.MaxRating = Convert.ToInt32(criteriumcontrol.Criterium.Domein.DomeinGewicht);
                    criteriumcontrol.Rating = dynamischeratingcontrol;
                    criteriumcontrol.Rating.Changed += new AjaxControlToolkit.RatingEventHandler(rating_Changed);
                }
            }
        }
    }        
    

    }

  2. Обработчик событий, который обрабатывает каждое событие для каждого из элементов управления рейтингом

    // Обработчик событий для каждого из элементов управления защищен void rating_Changed (отправитель объекта, AjaxControlToolkit.RatingEventArgs e) {AjaxControlToolkit.Rating gefirederatingcontrol = (AjaxControlToolkit.Rating) sender;Строка ratingid = gefirederatingcontrol.ID;

    Evaluatieform mijnform = (Evaluatieform) Session["formulier"];
    IEnumerator<DomeinsCriteriums> domeincontrolenum = mijnform.controls.GetEnumerator();
    
    while (domeincontrolenum.MoveNext())
    {
        foreach (CriteriumLijn criteriumcontrol in domeincontrolenum.Current.Criterias)
        {
            if (criteriumcontrol.Criterium.CriteriumNaam == ratingid)
                criteriumcontrol.Score = gefirederatingcontrol.CurrentRating;
        }
    }
    Session["formulier"] = mijnform;
    

    }

  3. Ошибка при загрузке страницы

В любом случае, яне возникает никаких ошибок, как в Visual Studio, но когда я запускаю свой веб-сайт и перехожу на страницу, даже если он не может выполнить код при открытии страницы (таблица, в которую должны быть добавлены элементы управления рейтингом, нетак что логическое значение, которое позволяет мне читать элементы управления при каждой загрузке страницы, равно false), он выдает мне следующие ошибки компиляции:

  • Ошибка компиляции

Описание: произошла ошибкаво время компиляции ресурса, необходимого для обслуживания этого запроса.Пожалуйста, просмотрите следующие конкретные подробности ошибки и измените свой исходный код соответствующим образом.

Compiler Error Message: CS0029: Cannot implicitly convert type
  'System.Collections.Generic.List<DomeinsCriteriums>.Enumerator' to 
  'System.Collections.Generic.IEnumerator<DomeinsCriteriums>'

Ошибка источника:

Line 334:
Line 335:        Evaluatieform mijnform = (Evaluatieform) Session["formulier"];
Line 336:        IEnumerator<DomeinsCriteriums> domeincontrolenum = mijnform.controls.GetEnumerator();
Line 337:
Line 338:        while (domeincontrolenum.MoveNext())

Source File: e:\Website Werkend (07-04-11)\Evaluatie.aspx.cs    Line: 336 

Я получаю ту же ошибку для строки 58, если я ее не комментирую.

У кого-нибудь есть идеи по этому поводу?Я невежественен.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2011

Что происходит, когда вы меняете эту строку

IEnumerator<DomeinsCriteriums> domeincontrolenum = mijnform.controls.GetEnumerator();

На

List<DomeinsCriteriums>.Enumerator domeincontrolenum = mijnform.controls.GetEnumerator();

или

var domeincontrolenum = mijnform.controls.GetEnumerator();
0 голосов
/ 18 апреля 2011

Похоже, что ControlCollection.GetEnumerator(), который вы вызываете, возвращает неуниверсальный IEnumerator .

Попробуйте

Evaluatieform mijnform = (Evaluatieform) Session["formulier"];
IEnumerator domeincontrolenum = mijnform.controls.GetEnumerator();

while (domeincontrolenum.MoveNext())
{
    DomeinsCriteriums current = (DomeinsCriteriums)domeincontrolenum.Current;
    foreach (CriteriumLijn criteriumcontrol in current.Criterias)
    {
        if (criteriumcontrol.Criterium.CriteriumNaam == ratingid)
            criteriumcontrol.Score = gefirederatingcontrol.CurrentRating;
    }
}
...