Изменение изображения при выборе параметра в списке переключателей

0

ПРИМЕЧАНИЕ: ЭТО РЕКОМЕНДУЕМЫЙ ВОПРОС, КОТОРЫЕ ЗНАЧИТЕЛЬНЫ ДЛЯ БОЛЕЕ ЧИСТОГО СОСТОЯНИЯ НОМЕРА И ИНФОРМАЦИИ.

Хорошо... Я работаю над проектом для моего сайта, который имеет форму, и использует элемент управления RadioButtonList для категорий товаров. В одной конкретной категории мой контроль списка радиостанций имеет 4 валуса:

<td>
<asp:RadioButtonList ID="radCPUType" RepeatDirection="Horizontal" runat="server">
  <asp:ListItem Value="AMD">AMD</asp:ListItem>
  <asp:ListItem Value="Intel">Intel</asp:ListItem>
  <asp:ListItem Value="AMD Dual (Server)">AMD Dual (Server)</asp:ListItem>
  <asp:ListItem Value="Intel Dual (Server)">Intel Dual (Server)</asp:ListItem>
</asp:RadioButtonList>
</td>

<td>
<asp:Image ID="Image6" runat="server" ImageUrl="~/Images/Icon_CPU.jpg" />
</td>

И рядом с Image6 управления списком, у меня есть элемент управления по умолчанию с именем Image6. Мне сложно сменить этот образ, когда я выбираю опцию списка переключателей. Код не взорван, но ничего не происходит, и изображение остается неизменным при выборе опции радио. Я пробовал различные методы из подобных примеров, и ни один из них не был полезен.

Я пробовал JQuery для моего скрипта и простой старый JavaScript, все безрезультатно. Я знаю, что мне нужно сделать ссылку на сценарий изображениями, которые у меня есть, в папке "Картинки" решения, но я не могу понять это. Изображение по умолчанию - Icon_CPU.jpg и для каждого выбора, скажем... Icon_CPU.jpg два, он изменится на следующее:

  1. AMD selection = AMD_CPU_1.jpg
  2. Intel selection = Intel_CPU_2.jpg

... и так далее. Изображения правильно выравниваются, если они жестко закодированы - я просто не могу заставить код работать над выбором. Может ли кто-нибудь помочь мне со сценарием, чтобы на самом деле сделать эту работу? Кроме того, можете ли вы сказать мне, нужно ли мне переименовывать мои элементы управления или добавлять что-либо в PageLoad серверного PageLoad управления? В настоящее время у меня ничего нет, как показано ниже.

public partial class Controls_CPUBuilderForm : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnResetBuild_Click(object sender, EventArgs e)
    {
        // Clear radio button selections on the form

        radFormSelect.ClearSelection();
        radDriveType.ClearSelection();
        radDriveSpace.ClearSelection();
        radPSUSelect.ClearSelection();

        radRAMSelect.ClearSelection();
        radCPUType.ClearSelection();
        radOpticalCount.ClearSelection();
        radScreenCount.ClearSelection();

        // Reset drop down lists to original selection

        ddlDriveCount.SelectedIndex = -1;
        ddlScreenOrient.SelectedIndex = -1;
    }
}

Спасибо всем за ваше терпение и знания, помогая мне получить лучшее понимание для будущих целей!

  • 0
    Вы согласны с тем, что страница отправляется на сервер при изменении значения radiobuttonlist, или вы хотите сделать это на стороне клиента?
  • 0
    Я хотел бы сохранить его на стороне сервера.
Показать ещё 2 комментария

4 ответа

1
Лучший ответ

Спасибо всем за ваши предложения. БОЛЬШОЕ СПАСИБО К "КЕНТУ АНДЕРСОНУ" - кто предоставил рамки, на которых я смог расширить свою работу, чтобы получить функциональность, которую я искал.

Тем не менее, ответ заключался в том, чтобы создать обработчик событий с контролем CodeBehind следующим образом:

protected void radCPUType_SelectedIndexChanged(object sender, EventArgs e)
{
   // This was Kent suggestion, and also to setup the ImageUrl as needed.

   Image6.ImageUrl = "~/Images/MyDefault.jpg";
}

Я устанавливаю ImageUrl для первоначального удержания изображения по умолчанию, прежде чем выбрать параметр в элементе управления. Затем мне понадобился способ заполнения изображений при выборе. Поскольку у многих предложений были разные и, возможно, более сложные способы достижения этого, я обнаружил, что могу сделать это, передав элемент управления как параметр w/присвоенное значение через структуру if-else w/в обработчике событий:

protected void radCPUType_SelectedIndexChanged(object sender, EventArgs e)
{
   // Setup the ImageUrl.

   Image6.ImageUrl = "~/Images/MyDefault.jpg";


   // Setup the if-else structure to assign images w/ the selections.

   if (radCPUType.SelectedValue == "A selected option value")
   {
      Image6.ImageUrl = "~/Images/Associated Image.jpg";
   }
   else if (radCPUType.Selectedvalue == "Another selected option value")
   {
      Image6.ImageUrl = "~/Images/Another Associated Image.jpg")
   }
   else
   {
      Image6.ImageUrl = "~/Images/The Default Image.jpg";
   }
}

Поскольку элемент управления RadioButtonList использует индекс, основанный на значении, класс SelectedValue был необходим, чтобы элемент управления мог удерживать выбор опции, как это указано в HTML-списке радио.

Элемент управления в разделе if равен опции, выбранной в списке переключателей; следующий оператор затем присваивает изображение, связанное с выбором опции к ImageUrl, и я else if, else else if, конечно, пройти через остальные параметры списка радио, заканчивая изображением по умолчанию в закрытии else части структуры. Это успех! Так что, опять же, поскольку я уверен, что есть другие способы решения проблемы, это лучше всего подходит для меня.

Еще раз спасибо за все ваши материалы, и еще один выстрел в Кент Андерсон, который советом послужил основой для развития.

  • 1
    Ну, это действительно работает, но я бы рекомендовал не возвращаться к коду для такого простого изменения. JS гораздо отзывчивее.
  • 0
    Возможно, стоит взглянуть на оператор switch в C # как на else if операторы там будут громоздкими: msdn.microsoft.com/en-us/library/06tc147t.aspx
Показать ещё 1 комментарий
1

Чтобы решить вашу проблему с помощью С#, создайте обработчик событий для SelectedIndexChanged в своем коде.

 protected void radCPUType_SelectedIndexChanged(object sender, EventArgs e)
    {
        // Set the ImageUrl however you like
        Image6.ImageUrl = "~/Images/Icon_CPU.jpg";
    }

Затем уточните свой список переключателей, чтобы установить AutoPostBack = "True" и OnSelectedIndexChanged = "radCPUType_SelectedIndexChanged"

<asp:RadioButtonList ID="radCPUType" RepeatDirection="Horizontal" runat="server" AutoPostBack="True" OnSelectedIndexChanged="radCPUType_SelectedIndexChanged">
                        <asp:ListItem Value="AMD">AMD</asp:ListItem>
                        <asp:ListItem Value="Intel">Intel</asp:ListItem>
                        <asp:ListItem Value="AMD Dual (Server)">AMD Dual (Server)</asp:ListItem>
                        <asp:ListItem Value="Intel Dual (Server)">Intel Dual (Server)</asp:ListItem>
                    </asp:RadioButtonList>
  • 0
    Спасибо, Кен. Я понял это. Ваше предложение было довольно полезным, однако. Как вы увидите в моем ответе, из всех этих предложений я смог в дальнейшем использовать его в CodeBehind обработчика событий. Еще раз спасибо!
0

Ответ был поднят прямо из предыдущего вопроса:

ASPX

<td>
<asp:RadioButtonList ID="radCPUType" RepeatDirection="Horizontal" runat="server">
  <asp:ListItem Value="AMD">AMD</asp:ListItem>
  <asp:ListItem Value="Intel">Intel</asp:ListItem>
  <asp:ListItem Value="AMD Dual (Server)">AMD Dual (Server)</asp:ListItem>
  <asp:ListItem Value="Intel Dual (Server)">Intel Dual (Server)</asp:ListItem>
</asp:RadioButtonList>
</td>

<td>
<asp:Image ID="Image6" runat="server" ImageUrl="~/Images/Icon_CPU.jpg" />
</td>

Javascript

$(document).ready(function () {
    $("#<%= yourID.ClientID %> input").click(function () {
        var value = $(this).val();
        var image_name;
        var image_path = "/Images/"; 
        //If the images directory isn't at the website root you could use asp.nets
        //resolveURL method instead

        switch (value)
        {
            case "AMD":
            image_name = '"AMD_CPU_1.jpg";
            break;

            case "Intel";
            image_name = "Intel_CPU_2.jpg"
            break;

            case "AMD Dual (Server)";
            image name = "" // Insert your image here
            break;

            case "Intel Dual (Server)";
            image name = "" // Insert your image here
            break;
       }

        /*************************************
        *Old  Ineeficient code
        if (value == 'AMD') {
            image_name = "AMD_CPU_1.jpg";
        } else {
            if (value == 'Intel') {
                image_name = "Intel_CPU_2.jpg";
            } else {
                image_name = "Icon_CPU.jpg";
            }
        }
        *************************************************/

        //console.log(image_name);
         $("#<%= Image6.ClientID %>").attr('src', image_path + image_name);
    });
});

<% %> - блок кода сервера и должен использоваться экономно на страницах aspx. <%= %> - короткая рука для <% Response.Write() %>. Если вы просмотрите исходный HTML-код страницы в браузере, вы увидите идентификатор клиента ASP.net элементов управления списком радио и кнопок в селекторах jQuery.

Вы также должны использовать инструмент, например FireBug для инструментов разработчика Firefox или Chrome, для проверки путей для изображения, как только вы нажимаете эти флажки, если вы получаете неожиданные результаты. Также обратите внимание на строку //console.log(image_name); , Удаление комментариев из этой строки приведет к сбросу значения image_name на консоль, что полезно для отладки. Подробнее см. Здесь: http://blogs.msdn.com/b/cdndevs/archive/2011/05/26/console-log-say-goodbye-to-javascript-alerts-for-debugging.aspx

Примечание

Я не вижу необходимости в управлении изображениями здесь. Простой старый тег изображения html будет работать. Если вы используете тег изображения, вы не получите имя имени asp.net, которое вы сделали в исходном вопросе, и можете ссылаться на него просто с помощью $("#Image6")

Дополнительная информация о инструкции switch если вы не знакомы с ней: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch

0

Сначала давайте присоединим событие JS в codebehind

radCPUType.Attributes.Add("onclick", "changeImage();");

Затем нам нужно создать JS-функцию.

 <script type="text/javascript">
    function changeImage() {

        var img = $('#<%=radCPUType.ClientID %>');

        switch ($('#<%=radCPUType.ClientID %> input[type=radio]:checked').val())
        {
            case 'AMD':
                img.src = 'newimage.png';
                break;
        }
    }
</script>

Я не тестировал это, но дайте мне знать, если что-то не работает.

  • 0
    Адам, ты можешь быть немного более информативным; мы присоединяем событие JS в PageLoad CodeBehind или как частный класс? Вы не были ясны в этом отношении. Пожалуйста, порекомендуйте.
  • 0
    Я поместил событие JS в PageLoad формы и использовал нужное изображение для выбора AMD как AMD_CPU_1.jpg - ничего не AMD_CPU_1.jpg . Это не взрывается, но просто не стреляет, чтобы изменить изображение.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню