BebeSaiyan Ответов: 2

Ошибка в ASP.NET website: 'itemimage1' имеет значение selectedvalue, которое является недопустимым, поскольку оно не существует в списке элементов. Имя параметра: значение


Теперь я узнаю все о asp.net и опробовать его основные инструменты. Я создал простую форму, в которую администратор может загружать изображения для веб-сайта. Проблема в том, что он выдает мне такую ошибку: 'itemImage1' имеет SelectedValue, которое является недопустимым, поскольку оно не существует в списке элементов. Имя параметра: value.

Теперь, чтобы лучше понять, что я пытаюсь сделать. Вот изображение формы, которую я создал на своем сайте.

(Пожалуйста, проверьте изображение здесь для формы по этой ссылке: )[^]

Как вы можете видеть, у администратора есть выбор, хочет ли он загрузить изображение для гитарных или басовых продуктов. Для этого примера я выбрал гитарный радиобуттон. Тогда он будет генерировать имеющихся изображений в dropdownbox, по пункту рис1 и Рис2 поз.

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

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

Что я уже пробовал:

Вот код для файла aspx. cs:

protected void Page_Load(object sender, EventArgs e)
{
    string itemselectedValue1 = itemImage1.SelectedValue;
    ShowItemImages1();
    itemImage1.SelectedValue = itemselectedValue1;

    string itemselectedValue2 = itemImage2.SelectedValue;
    ShowItemImages2();
    itemImage2.SelectedValue = itemselectedValue2;

}

private void ShowItemImages1()
{
    if (itemType1.Checked)
    {
        string[] images = Directory.GetFiles(Server.MapPath("~/Images/Brands/String Instrument Items/Guitar/"));
        ArrayList imageList = new ArrayList();

        foreach (string image in images)
        {
            string imageName = image.Substring(image.LastIndexOf(@"\") + 1);
            imageList.Add(imageName);
        }

        itemImage1.DataSource = imageList;
        itemImage1.DataBind();

    }
    else if (itemType2.Checked)
    {

        string[] images = Directory.GetFiles(Server.MapPath("~/Images/Brands/String Instrument Items/Bass/"));
        ArrayList imageList = new ArrayList();

        foreach (string image in images)
        {
            string imageName = image.Substring(image.LastIndexOf(@"\") + 1);
            imageList.Add(imageName);
        }

        itemImage1.DataSource = imageList;
        itemImage1.DataBind();

    }
}


private void ShowItemImages2()
{
    if (itemType1.Checked) {

        string[] images = Directory.GetFiles(Server.MapPath("~/Images/Brands/String Instrument Items/Guitar/"));
        ArrayList imageList = new ArrayList();

        foreach (string image in images)
        {
            string imageName = image.Substring(image.LastIndexOf(@"\") + 1);
            imageList.Add(imageName);
        }

        itemImage2.DataSource = imageList;
        itemImage2.DataBind();

    } else if (itemType2.Checked) {

        string[] images = Directory.GetFiles(Server.MapPath("~/Images/Brands/String Instrument Items/Bass/"));
        ArrayList imageList = new ArrayList();

        foreach (string image in images)
        {
            string imageName = image.Substring(image.LastIndexOf(@"\") + 1);
            imageList.Add(imageName);
        }

        itemImage2.DataSource = imageList;
        itemImage2.DataBind();

    } 
}


Вот также файл aspx(если это необходимо):

<table cellspacing="15" class="brandsTable">

               <tr>
                    <td style="width: 160px; height: 37px;">

                    Item Type:</td>

                    <td style="height: 37px">

                        <asp:RadioButton ID="itemType1" runat="server" Text="Guitar" AutoPostBack="True" GroupName="ItemType"/>
                        <asp:RadioButton ID="itemType2" runat="server" Text="Bass" AutoPostBack="True" GroupName="ItemType"/>

                    </td>
                </tr>
                <tr>
                    <td style="width: 160px; height: 37px;">

                    Item Brand:</td>

                    <td style="height: 37px">

                    <asp:TextBox ID="itemBrand" runat="server" BackColor="#FFFF66" BorderColor="Black" BorderWidth="1px" Height="20px" Width="300px"></asp:TextBox>

                    </td>
                </tr>
                <tr>
                    <td style="width: 160px; height: 37px;">

                    Item Model:</td>

                    <td style="height: 37px">

                    <asp:TextBox ID="itemModel" runat="server" BackColor="#FFFF66" BorderColor="Black" BorderWidth="1px" Height="20px" Width="300px"></asp:TextBox>

                    </td>
                </tr>
                <tr>
                    <td style="width: 160px; height: 37px;">

                    Item Price:</td>

                    <td style="height: 37px">

                    <asp:TextBox ID="itemPrice" runat="server" BackColor="#FFFF66" BorderColor="Black" BorderWidth="1px" Height="20px" Width="300px"></asp:TextBox>

                    </td>
                </tr>
                <tr>
                    <td style="width: 160px; height: 37px;">

                    Item Image1:</td>

                    <td style="height: 37px">

                    <asp:DropDownList ID="itemImage1" runat="server" Width="300px">
                    </asp:DropDownList>
                    <br />
                    <asp:FileUpload ID="itemFileUpload1" runat="server" />

                    <asp:Button ID="itemUploadImage1" runat="server" Text="Upload Image" OnClick="itemUploadImage1_Click"/>

                    </td>
                </tr>
                <tr>
                    <td style="width: 160px; height: 37px;">

                    Item Image2:</td>

                    <td style="height: 37px">

                    <asp:DropDownList ID="itemImage2" runat="server" Width="300px"></asp:DropDownList>
                    <br />
                    <asp:FileUpload ID="itemFileUpload2" runat="server" />

                    <asp:Button ID="itemUploadImage2" runat="server" Text="Upload Image" OnClick="itemUploadImage2_Click"/>

                    </td>
                </tr>


Вот также исходная ошибка и трассировка стека:
Source Error: 


Line 20:             itemselectedValue1 = itemImage1.SelectedValue;
Line 21:             ShowItemImages1();
Line 22:             itemImage1.SelectedValue = itemselectedValue1;
Line 23: 
Line 24:             itemselectedValue2 = itemImage2.SelectedValue;

Source File: c:\Users\User1\Documents\Visual Studio 
2015\WebSites\MusicStore\Pages\CreateBrands.aspx.cs    Line: 22 

Stack Trace: 


[ArgumentOutOfRangeException: 'itemImage1' has a SelectedValue which is 
invalid because it does not exist in the list of items.
Parameter name: value]
System.Web.UI.WebControls.ListControl.set_SelectedValue(String value) 
+9703262
Pages_CreateBrands.Page_Load(Object sender, EventArgs e) in 
c:\Users\User1\Documents\Visual Studio 
2015\WebSites\MusicStore\Pages\CreateBrands.aspx.cs:22
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, 
EventArgs e) +51
System.Web.UI.Control.OnLoad(EventArgs e) +95
System.Web.UI.Control.LoadRecursive() +59
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, 
Boolean includeStagesAfterAsyncPoint) +678

2 Ответов

Рейтинг:
6

Super Superman

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

protected void Page_Load(object sender, EventArgs e)
{
    ShowItemImages();
}

private void ShowItemImages()
{
    var imageList = new ArrayList();

    if (itemType1.Checked)
    {
        var images = Directory.GetFiles(Server.MapPath("~/Images/Brands/String Instrument Items/Guitar/"));

        foreach (var image in images)
        {
            var imageName = image.Substring(image.LastIndexOf(@"\") + 1);
            imageList.Add(imageName);
        }

        itemImage1.DataSource = imageList;
        itemImage1.DataBind();

    }
    else if (itemType2.Checked)
    {

        var images = Directory.GetFiles(Server.MapPath("~/Images/Brands/String Instrument Items/Bass/"));

        foreach (var image in images)
        {
            var imageName = image.Substring(image.LastIndexOf(@"\") + 1);
            imageList.Add(imageName);
        }
    }

    itemImage1.DataSource = imageList;
    itemImage1.DataBind();

    itemImage2.DataSource = imageList;
    itemImage2.DataBind();
}


BebeSaiyan

Извините за предыдущий комментарий. Оказывается, это работает. Спасибо за помощь, сэр.

Super Superman

Нет проблем, рад, что это тебе помогло.

BebeSaiyan

Еще раз привет! Только сегодня я заметил в этом решении что-то странное. Допустим, для itemImage1 у меня есть изображения 1,2 и 3, и я решил выбрать изображение 3, оно всегда будет возвращать изображение 1. Независимо от того, какой образ я выберу, он всегда будет возвращать изображение 1. Кроме того, для itemImage2, независимо от того, какое изображение было выбрано для itemImage1, оно будет реплицировать его, что не является выходом, который я себе представляю. Есть какие-нибудь решения для этого? Прости за это. Я только сегодня заметил жучок.

Рейтинг:
1

Super Superman

Вам нужно изменить код Page_Load так, чтобы он инициализировал изображения только при первой загрузке страницы. На данный момент он делает это каждый раз, когда вы загружаете или отправляете страницу обратно.

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        string itemselectedValue1 = itemImage1.SelectedValue;
        ShowItemImages1();
        itemImage1.SelectedValue = itemselectedValue1;
 
        string itemselectedValue2 = itemImage2.SelectedValue;
        ShowItemImages2();
        itemImage2.SelectedValue = itemselectedValue2;
    } 
}

Еще один совет - вы узнаете о ASP.NET WebForms-это довольно старая технология. Если у вас нет конкретной причины для изучения этого (то есть поддержания унаследованного проекта), вам было бы гораздо лучше инвестировать свое время в обучение ASP.NET MVC, ASP.NET ядро, веб-API и / или AngularJS.


BebeSaiyan

Я попробовал ваше решение, радиобаттон теперь работает от гитары до баса. Но проблема в том, что ShowItemImages1 и ShowItemImages2 не привязали изображения к выпадающему списку. Выпадающий список пуст. Есть еще идеи? Кстати, спасибо за совет.

Super Superman

Я пропустил ваши переключатели, автоматически отправляющие ответ. Взгляните на решение 2 ниже..