JT1992 Ответов: 3

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


Я программно добавляю comboboxes для каждого подсчета столбцов из gridview. gridview получает количество столбцов из листа excel, загружаемого с другой страницы. Тем не менее, я хочу знать, допустим, в gridview есть 20 столбцов, и у меня есть 20 элементов выпадающего списка, добавленных на страницу. как я могу сказать, какой элемент выпадающего списка был выбран? каждое выпадающее число соотносится со строкой. таким образом, если есть 20 строк, то есть 20 элементов выпадающего списка. Пожалуйста помочь. Спасибо.

Не голосуйте вниз, пожалуйста, помогите мне понять мою ошибку, задавая этот вопрос. СПАСИБО

trLists.Cells.Clear()
            For i As Integer = 0 To GridView1.Rows(0).Cells.Count - 1
                Dim dd1 As New DropDownList()
                dd1.ID = "dd1" + i.ToString()
                dd1.Width = Unit.Pixel(150)
                If GlobalVariable.Flag = "1B" Then
                    dd1.Items.Insert(0, New ListItem(String.Empty, String.Empty))
                    dd1.Items.Add("Borough/Zip Code")
                    dd1.Items.Add("Address No.")
                    dd1.Items.Add("Street Name")
                    dd1.Items.Add("Freeform")
                ElseIf GlobalVariable.Flag = "2" Then
                    dd1.Items.Insert(0, New ListItem(String.Empty, String.Empty))
                    dd1.Items.Add("Borough/Zip Code")
                    dd1.Items.Add("Street 1")
                    dd1.Items.Add("Street 2")
                ElseIf GlobalVariable.Flag = "3" Then
                    dd1.Items.Insert(0, New ListItem(String.Empty, String.Empty))
                    dd1.Items.Add("Borough/Zip Code")
                    dd1.Items.Add("On Street")
                    dd1.Items.Add("First Cross Street")
                    dd1.Items.Add("Second Cross Street")
                    dd1.Items.Add("Side Of The Street")
                ElseIf GlobalVariable.Flag = "3S" Then
                    dd1.Items.Insert(0, New ListItem(String.Empty, String.Empty))
                    dd1.Items.Add("Borough/Zip Code")
                    dd1.Items.Add("On Street")
                    dd1.Items.Add("First Cross Street")
                    dd1.Items.Add("Second Cross Street")
                ElseIf GlobalVariable.Flag = "BL" Then
                    dd1.Items.Insert(0, New ListItem(String.Empty, String.Empty))
                    dd1.Items.Add("Borough/Zip Code")
                    dd1.Items.Add("Block")
                    dd1.Items.Add("Lot")
                ElseIf GlobalVariable.Flag = "BN" Then
                    dd1.Items.Insert(0, New ListItem(String.Empty, String.Empty))
                    dd1.Items.Add("BIN Number")
                Else
                    dd1.Items.Insert(0, New ListItem(String.Empty, String.Empty))
                    dd1.Items.Add("Borough")
                    dd1.Items.Add("Street Name")
                End If
                Dim cell As New TableCell()
                cell.Controls.Add(dd1)
                trLists.Cells.Add(cell)
                GlobalVariable.dd1 = dd1
            Next


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

я попытался опубликовать тот же вопрос в Stack overflow, но, по-моему, никто его не получил. вот почему я выбрал проект code.

3 Ответов

Рейтинг:
22

Vincent Maverick Durano

Чтобы сделать это более понятным для вас, я сделал еще одну демонстрацию. Мы добавим в разметку таблицу, HiddenField, GridView и элемент управления Button.

Aspx-файл:

<asp:table id="tbl1" runat="server" />
<asp:hiddenfield id="HiddenField1" runat="server" />
<asp:gridview id="GridView1" runat="server">
</asp:gridview>
<asp:button id="Button1" runat="server" onclick="Button1_Click" text="Button"/>


В таблице мы генерируем выпадающий список на основе
Скрытое поле-это место, где мы храним выбранный идентификатор выпадающего списка в событии SelectedIndexChanged выпадающего списка
GridView содержит ваши данные
Кнопка - это место, где мы получаем значение из HiddenField и отображаем его в окне сообщения (alert)

Теперь вот кодовый блок:

VB.NET
Protected Sub Page_Load(sender As Object, e As EventArgs)
	If Not IsPostBack Then
			'bind  your grid here
		BindGridView()
	End If

	GenerateDropDowns(GridView1.Columns.Count)
End Sub

Private Sub GenerateDropDowns(colCount As Integer)

	Dim row As New TableRow()
	For i As Integer = 0 To colCount - 1
		Dim cell As New TableCell()
		Dim ddl As New DropDownList()
		ddl.ID = "ddl" + i.ToString()
		ddl.Items.Add(New ListItem("PASS", "P"))
		ddl.Items.Add(New ListItem("FAIL", "F"))
		ddl.AutoPostBack = True
		'wire up the event
		AddHandler ddl.SelectedIndexChanged, AddressOf OnSelectedIndexChanged

		cell.Controls.Add(ddl)

		row.Cells.Add(cell)
	Next
	tbl1.Rows.Add(row)
End Sub

Protected Sub OnSelectedIndexChanged(sender As Object, e As EventArgs)
	Dim ddl1 As DropDownList = DirectCast(sender, DropDownList)
	HiddenField1.Value = ddl1.ID
End Sub

Protected Sub Button1_Click(sender As Object, e As EventArgs)
	Dim theDropDown As String = HiddenField1.Value
	If theDropDown <> String.Empty Then
		Dim msgScript As String = String.Format("alert('You have selected: {0}');", theDropDown)
		Page.ClientScript.RegisterClientScriptBlock(Me.[GetType](), "Alert", msgScript, True)

			'reset
		HiddenField1.Value = String.Empty
	End If
End Sub


Эквивалент C# :
protected void Page_Load(object sender, EventArgs e) {
    if (!IsPostBack) {
        BindGridView();//bind  your grid here
    }

    GenerateDropDowns(GridView1.Columns.Count);
}

private void GenerateDropDowns(int colCount) {

    TableRow row = new TableRow();
    for (int i = 0; i < colCount; i++) {
        TableCell cell = new TableCell();
        DropDownList ddl = new DropDownList();
        ddl.ID = "ddl" + i.ToString();
        ddl.Items.Add(new ListItem("PASS", "P"));
        ddl.Items.Add(new ListItem("FAIL", "F"));
        ddl.AutoPostBack = true;
       //wire up the event
        ddl.SelectedIndexChanged += OnSelectedIndexChanged;

        cell.Controls.Add(ddl);
        row.Cells.Add(cell);

    }
    tbl1.Rows.Add(row);
}

protected void OnSelectedIndexChanged(object sender, EventArgs e) {
    DropDownList ddl1 = (DropDownList)sender;
    HiddenField1.Value = ddl1.ID;
}

protected void Button1_Click(object sender, EventArgs e) {
    string theDropDown = HiddenField1.Value;
    if (theDropDown != string.Empty) {
        string msgScript = string.Format("alert('You have selected: {0}');", theDropDown);
        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Alert", msgScript, true);

        HiddenField1.Value = string.Empty;//reset
    }
}


Надеюсь, это поможет и прояснит ваше замешательство.


JT1992

aspx в этом коде не работает. не знаю почему.

Vincent Maverick Durano

кстати, код предназначен только для того, чтобы дать вам представление, и он ничего не будет отображать, потому что я не включил код для привязки gridview. Для того чтобы он работал, вы должны связать сетку с данными.

Vincent Maverick Durano

можете ли вы заставить его работать сейчас?

Vincent Maverick Durano

я отредактировал код попробуйте прямо сейчас

CHill60

Это становится немного запутанным, когда вы публикуете несколько ответов на один и тот же вопрос - какой из них должен быть решением? Лучше использовать Улучшить решение ссылка

Vincent Maverick Durano

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

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

Это не будет сбивать с толку, если ОП отметит, какое решение действительно сработало для него.

CHill60

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

Vincent Maverick Durano

Ну, цель состоит в том, чтобы помочь им решить их проблему.

JT1992

дело в том, что я не знаю, как получить идентификатор выбранного выпадающего объекта, а также Как определить, был ли выбран один из элементов из выпадающего списка. как будто я потерялся не знаю почему

Vincent Maverick Durano

вы хотя бы попробовали код или хотя бы поняли его?

JT1992

Эй, да, я сделал это, но я не уверен, как я могу привязать представление сетки данных.

Vincent Maverick Durano

Я уже продемонстрировал код для привязки GridView. Вы должны быть в состоянии легко следовать ему.

JT1992

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

Vincent Maverick Durano

Отладили ли вы код и посмотрели, проходит ли он через код, в котором вы генерируете выпадающие списки? Ты проверил если управления gridview1.Столбцы.Количество больше 0?

JT1992

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

Vincent Maverick Durano

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

Чтобы ответить на ваш текущий вопрос, вам нужно сохранить каждый выпадающий список (район, Адрес, улица) в отдельном hiddendfields. Обратите внимание, что вы всегда можете получить идентификатор выпадающего списка, который запускает событие в событии SelectedIndexChanged. Пожалуйста, поймите, как работает код, и, пожалуйста, отладьте свой код.

JT1992

черт возьми, это сработало. хаха. я был сбит с толку,но миссия выполнена. отмечая это как ответ. спасибо, парень.

Vincent Maverick Durano

ууу! Я рад, что теперь это сработало. :) Я рад быть полезным :)

Рейтинг:
14

Vincent Maverick Durano

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

Проводите мероприятие:

dd1.SelectedIndexChanged += OnSelectedIndexChanged;


VB.NET
AddHandler dd1.SelectedIndexChanged, AddressOf OnSelectedIndexChanged


Затем вы можете написать код для доступа к выбранному элементу, например:

С#
protected void OnSelectedIndexChanged(object sender, EventArgs e){
        DropDownList ddl1 = (DropDownList)sender;
        GridViewRow row = (GridViewRow)ddl1.NamingContainer;
        if (row != null)
        {
            string selectedItem = ddl1.SelectedItem.Text;
        }
}


VB.NET
Protected Sub OnSelectedIndexChanged(sender As Object, e As EventArgs)
	Dim ddl1 As DropDownList = DirectCast(sender, DropDownList)
	Dim row As GridViewRow = DirectCast(ddl1.NamingContainer, GridViewRow)
	If row IsNot Nothing Then
		Dim selectedItem As String = ddl1.SelectedItem.Text
	End If
End Sub


JT1992

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

Richard Deeming

ВБ не использовать += для подключения обработчиков событий-он использует AddHandler:
AddHandler dd1.SelectedIndexChanged, OnSelectedIndexChanged

И тебе это не нужно. new EventHandler(...) декоратор в VB или C# начиная с .NET 1.0-компилятор достаточно умен, чтобы добавить это для вас. :)
dd1.SelectedIndexChanged += OnSelectedIndexChanged;

Vincent Maverick Durano

Я не парень VB, и я просто использую инструмент конвертера, чтобы преобразовать его в VB. Так что вините инструмент ;) Я обновил свой ответ, чтобы добавить правильный синтаксис.

Спасибо за информацию. Очень ценный человек! :)

JT1992

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

Vincent Maverick Durano

Попробовать это:

Добавитьобработчик дд1.Разделе Мы Рассмотрим, Оператором Addressof OnSelectedIndexChanged

JT1992

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

Vincent Maverick Durano

поместите его перед добавлением элемента управления в коллекцию ячеек, например:

Добавитьобработчик дд1.Разделе Мы Рассмотрим, Оператором Addressof OnSelectedIndexChanged
ячейка.Управления.Добавить (dd1)

JT1992

но тогда как я узнаю, в какой строке был выбран индекс? например, если я выберу 5-й из 20 выпадающих элементов списка. как я увижу, что пятый был выбран?

Vincent Maverick Durano

Я объяснил это в своем первом посте. Вы можете определить, какой выпадающий список запускает событие, приведя отправителя объекта.

Защищенные суб OnSelectedIndexChanged(отправителя как объект, как EventArgs в)
Dim ddl1 As DropDownList = DirectCast(отправитель, DropDownList)
Dim row As GridViewRow = DirectCast(ddl1. NamingContainer, GridViewRow)
Дим параметр rowindex, как целое число = строка.Параметр rowindex ' получить текущий индекс строки таблицы
Если строка не является ничем тогда
Dim selectedItem As String = ddl1.Элемент.Текст
Конец, Если
Конец Подводной Лодки

JT1992

итак, есть ли способ проверить это с помощью messagebox? просто чтобы получить индекс строки значения?

Vincent Maverick Durano

Просто распечатайте его на странице с помощью:

Ответ.Запись (rowIndex)

Или лучше отладьте свой код, установите точку останова в OnSelectedIndexChanged и шагните в каждую строку, чтобы увидеть фактические значения.

JT1992

что, если бы я хотел, чтобы это событие сработало по щелчку кнопки? а потом выскочить из окна сообщения?

Vincent Maverick Durano

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

JT1992

вот в чем проблема его внешнего вида. не знаю как проверить этот код :/

Vincent Maverick Durano

Я постараюсь создать образец демо-версии, если смогу взломать его для вас.

JT1992

очень ценю вашу помощь еще раз.

Vincent Maverick Durano

не проблема. просто не забудьте закрыть эту тему, чтобы будущие читатели могли легко найти пост, который поможет вам. :) Спасибо!

JT1992

потрясающе, большое спасибо.

Vincent Maverick Durano

проверьте решение 2 на наличие решения. :)

Рейтинг:
10

Vincent Maverick Durano

Хорошо, вот еще одно решение вашей проблемы. Идея состоит в том, чтобы использовать элемент управления HiddenField для хранения выбранного rowIndex. Вот демонстрационная программа ниже:

Aspx-файл:

<asp:content id="Content2" contentplaceholderid="MainContent" runat="server" xmlns:asp="#unknown">
    <asp:gridview id="GridView1" runat="server" onrowcreated="GridView1_RowCreated">
        <columns>
                <asp:templatefield>
                    <itemtemplate>
                        <asp:hiddenfield id="HiddenField1" runat="server" value="0" />
                    </itemtemplate>
                </asp:templatefield>
         </columns>
    </asp:gridview>
    <asp:button id="Button1" runat="server" onclick="Button1_Click" text="Button" />
</asp:content>


С ФОНОВЫМ КОДОМ:
using System;
using System.Web.UI.WebControls;
using System.Data;
using System.Web.UI;

namespace WebFormDemo
{
    public partial class DynamicControlInGridView : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e) {
            if (!IsPostBack)
                BindGridView();
        }

        protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) {
            if (e.Row.RowType == DataControlRowType.DataRow) {
                DropDownList ddlResult = new DropDownList();
                ddlResult.ID = "ddlResult";
               
                ddlResult.Items.Add(new ListItem("PASS", "P"));
                ddlResult.Items.Add(new ListItem("FAIL", "F"));
                ddlResult.AutoPostBack = true;
                ddlResult.SelectedIndexChanged += OnSelectedIndexChanged;

                e.Row.Cells[0].Controls.Add(ddlResult);

            }
        }

        protected void OnSelectedIndexChanged(object sender, EventArgs e) {
            DropDownList ddl1 = (DropDownList)sender;
            GridViewRow row = (GridViewRow)ddl1.NamingContainer;
            if (row != null) {
                HiddenField hf = (HiddenField)row.FindControl("HiddenField1");
                hf.Value = row.RowIndex.ToString();
            }
        }

        private void BindGridView() {
            GridView1.DataSource = CreateDataSource();
            GridView1.DataBind();
        }

        public DataTable CreateDataSource() {
            DataTable dt = new DataTable();
            DataRow dr;

            dt.Columns.Add(new DataColumn("ID", typeof(string)));
            dt.Columns.Add(new DataColumn("Name", typeof(string)));
            dt.Columns.Add(new DataColumn("Lastname", typeof(string)));

            for (int i = 0; i < 20; i++) {
                dr = dt.NewRow();

                dr[0] = i;
                dr[1] = "Name" + i.ToString();
                dr[1] = "Last Name" + i.ToString();

                dt.Rows.Add(dr);
            }

            return dt;
        }

        protected void Button1_Click(object sender, EventArgs e) {

            foreach (GridViewRow row in GridView1.Rows) {
                HiddenField hf = (HiddenField)row.FindControl("HiddenField1");
                if (hf != null) {
                    int selectedRowIndex = Convert.ToInt32(hf.Value);
                    if (selectedRowIndex > 0) {
                        string msgScript = string.Format("alert('You have selected: {0}');", selectedRowIndex);
                        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Alert", msgScript, true);

                        hf.Value = "0";//reset
                        break;
                    }
                }              
            }
        }
       
    }
}


Это должно сработать. Приведенный выше код написан на языке C#. Возможно, вам придется преобразовать его в VB перед его применением. Надеюсь, это поможет.


JT1992

Эй, есть ли способ показать вам изображение того, как будет выглядеть моя страница?

JT1992

потому что я полагаю, что вы думаете, что выпадающие списки находятся внутри gridview, в котором они не являются отдельными объектами div. но я хочу знать, когда я выбираю, скажем, значение под названием test из выпадающего списка. я хочу знать, какой объект выпадающего списка я выбрал.

Vincent Maverick Durano

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

Vincent Maverick Durano

Если вам просто нужно определить, какой выпадающий список вы выбрали, то вы все равно можете использовать тот же подход, приведя отправителя объекта, который запускает selecteindexchangedevent. Но на этот раз вам просто нужно получить идентификатор выпадающего списка, чтобы определить, какой именно выпадающий список вы выбрали:

Защищенные суб OnSelectedIndexChanged(отправителя как объект, как EventArgs в)
Dim ddl1 As DropDownList = DirectCast(отправитель, DropDownList)
Дим идентификатор как строку = ddl1.Идентификатор
Конец Подводной Лодки

JT1992

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

Vincent Maverick Durano

Забудьте о ретрансляторе. Вы пробовали то, что я предложил, чтобы просто получить идентификатор выпадающего списка, чтобы определить, какой из них запускает событие?

JT1992

я не знаю, как получить удостоверение. потому что я динамически добавляю выпадающий список в зависимости от строк. так, допустим, если я выберите значение из выпадающего одним и значение тест 2 из другого как бы я знаю, что я избранный?

Vincent Maverick Durano

При создании выпадающего списка вы назначаете идентификатор с помощью следующего кода:

дд1.Идентификатор = "дд1" + я.Метод toString()

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

Добавитьобработчик дд1.Разделе Мы Рассмотрим, Оператором Addressof OnSelectedIndexChanged

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

Защищенные суб OnSelectedIndexChanged(отправителя как объект, как EventArgs в)
Dim ddl1 As DropDownList = DirectCast(отправитель, DropDownList)
Дим идентификатор как строку = ddl1.Идентификатор
Конец Подводной Лодки

JT1992

ладно, куда бы я положил обработчика. я добавляю выпадающие списки динамически при загрузке страницы, однако я хочу знать, какие выпадающие элементы выбираются с помощью текстов test, test 2 и test 3, зная, какой идентификатор был выбран. как я могу добавить этот обработчик к кнопке, а затем msgbox выбранный идентификатор.

Vincent Maverick Durano

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

Вы не можете добавить этот обработчик SelectedIndexChanged в событие Button. Проверь решение 2. Вы можете следовать той же логике, а именно использовать скрытое поле для хранения идентификатора, чтобы вы могли ссылаться на значение в событии щелчка вашей кнопки.

Vincent Maverick Durano

Я добавил Решение 3 для вашей справки. Надеюсь, это все прояснит.

JT1992

если вы хотите, я могу опубликовать весь код этой страницы, чтобы вам было легче

JT1992

http://i.stack.imgur.com/YxZAV.png

подобный этому