Как найти элемент управления и изменить его на отмеченный / снятый с Code-Behind (ASP.NET) - PullRequest
1 голос
/ 27 июня 2019

У меня есть эти переключатели:

<fieldset class="rating">
    <input runat="server" type="radio" onclick="setRating(5);" id="star10" name="rating" value="5" /><label class = "full" for="star5" title="Excelsior! - 5 stars"></label>
    <input runat="server" type="radio" onclick="setRating(4.5);" id="star9" name="rating" value="4 and a half" /><label class="half" for="star4half" title="Almost Perfect - 4.5 stars"></label>
    <input runat="server" type="radio" onclick="setRating(4);" id="star8" name="rating" value="4" /><label class = "full" for="star4" title="Good - 4 stars"></label>
    <input runat="server" type="radio" onclick="setRating(3.5);" id="star7" name="rating" value="3 and a half" /><label class="half" for="star3half" title="Above Average - 3.5 stars"></label>
    <input runat="server" type="radio" onclick="setRating(3);" id="star6" name="rating" value="3" /><label class = "full" for="star3" title="Average - 3 stars"></label>
    <input runat="server" type="radio" onclick="setRating(2.5);" id="star5" name="rating" value="2 and a half" /><label class="half" for="star2half" title="Adequate - 2.5 stars"></label>
    <input runat="server" type="radio" onclick="setRating(2);" id="star4" name="rating" value="2" /><label class = "full" for="star2" title="Underwhelming - 2 stars"></label>
    <input runat="server" type="radio" onclick="setRating(1.5);" id="star3" name="rating" value="1 and a half" /><label class="half" for="star1half" title="Weak - 1.5 stars"></label>
    <input runat="server" type="radio" onclick="setRating(1);" id="star2" name="rating" value="1" /><label class = "full" for="star1" title="Bad - 1 star"></label>
    <input runat="server" type="radio" onclick="setRating(0.5);" id="star1" name="rating" value="half" /><label class="half" title="Atrocious - 0.5 stars"></label>
</fieldset>

Я хочу просмотреть их все, чтобы установить их состояние без необходимости делать что-то вроде switch statement, поэтому я попробовал следующее:

for (double i = 0; i < 5; i+=0.5)
{
    if(pOld.OverallRating == i)
    {
        //Stars are 1-10 but display as x/5 (where 5 is star10, 4.5/5 is star9 etc)
        Control con = FindControl("star"+i);
        ((RadioButton)con).Checked = true;
    }
}

Кажется, есть проблема с тем, как я использую FindControl, но я не понимаю, почему - я получаю исключение нулевой ссылки.

EDIT1:

System.InvalidCastException: 'Unable to cast object of type 'System.Web.UI.HtmlControls.HtmlInputRadioButton' to type 'System.Web.UI.WebControls.RadioButton'.'

1 Ответ

1 голос
/ 27 июня 2019

Ваши входы называются star1, star2... star10, но ваш цикл устанавливает i в 0, 0.5, 1 ... 5, поэтому вы будете искать элемент управления с идентификатором star0, star0.5 и т. Д.не существует

Предполагая, что вы не хотите иметь флажок, представляющий 0 звезд, вы захотите сделать что-то вроде этого:

for (double i = 0.5; i <= 5; i+=0.5)
{
    if(pOld.OverallRating == i)
    {
        //Stars are 1-10 but display as x/5 (where 5 is star10, 4.5/5 is star9 etc)
        var id = i * 2;
        Control con = FindControl("star"+id);
        ((HtmlInputRadioButton)con).Checked = true;
    }
}

, который будет искать входные данные с идентификатором star1, star2... star10

РЕДАКТИРОВАТЬ: Чтобы ответить на обновленный вопрос - вы пытаетесь привести элемент управления типа HtmlInputRadioButton к RadioButton - вместо этого приведите к HtmlInputRadioButton

...