Рейтинг:
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
подобный этому