Есть GridView
Есть поле Button Field Значение которой берется из базы SQL Server
Необходимо по клику по этому полю получить значение этой ячейки...
Собственно как?:))
Я сделал так
В GridView DataKeyNames ввел Company (Текстовое ключевое поле)
и на событие
protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
int idx = GridView1.SelectedIndex;
Label4.Text = GridView1.DataKeys[idx].Value.ToString();
}
Выводитчся пустое значение((( что я делаю не так?
Добраться до значения в GridView ASP.NET 2.0
Модератор: Злобный
А кто тебе сказал, что этот ивент выстрелит? Дебаггер тебе на что? Поставь точку останова и посмотри, зайдет ли программа в твой обработчик события. Это раз. При нажатии на линк в гриде стреляет "RowCommand". Это два. Ты индекс выбранной строки получаешь (idx), а потом его используешь в DataKeys (что является колонками грида). Какое отношение строка имеет к колонке? В общем, тут достаточно причин для того, чтобы твой пример не работал.
Чтобы работал, используй событие "RowCommand", твой датасурс лучше скэшировать на сервере и при обработке события получать индекс строки, вызвавшей событие (он будет в e.CommandArgument). По этому индексу брать из датасурса строку, из нее - свои данные. Но если в одной строке больше одной кнопки, требующей такой обработки, процесс немного усложнится. Придется добавить к каждой CommandName, по которому потом выбирать, из какой колонки брать данные.
Чтобы работал, используй событие "RowCommand", твой датасурс лучше скэшировать на сервере и при обработке события получать индекс строки, вызвавшей событие (он будет в e.CommandArgument). По этому индексу брать из датасурса строку, из нее - свои данные. Но если в одной строке больше одной кнопки, требующей такой обработки, процесс немного усложнится. Придется добавить к каждой CommandName, по которому потом выбирать, из какой колонки брать данные.
- MXC
- Продвинутый
- Сообщения: 267
- Зарегистрирован: Чт сен 18, 2003 03:32
- Откуда: Кишингтаун
- Контактная информация:
Собственно часть кода взята отсюда:
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref16/html/E_System_Web_UI_WebControls_GridView_SelectedIndexChanged.htm
Где воплощено это так)) но не работает у меня) Логика мне показалась следующей: KeyFileld -Поле (вертикальная), idx (GridView1.SelectedIndex) - Запись(горизантальная) она применяется к KeyFileld и возвращает значение ячейки на перекрестии в Лебл)
в лбом случае у меня заработало.. нашел тут информацию))
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref16/html/E_System_Web_UI_WebControls_GridView_RowCommand.htm
Огромное спасибо!!
[off]добавлено спустя 19 минут:[/off]
Только вот такое интересный момент значицо обнаружен...
Все нормально значения берутся из ячейки и выводятся в лейбл... НО!
мне нужно получить Text LinkButton'a - того самого контрола по которому срабатывает Row_Command! Значение это получить не удается в отличие от зачения ЛЮБОЙ другой яччейки... я подумал и доабавил еше один BoundField , дублирующее значение LinkButton'a и естественно ему задал Visible=false.... ну и естественно в таком состтояниизначение получить не удается... как быть не подскажите?:)))
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref16/html/E_System_Web_UI_WebControls_GridView_SelectedIndexChanged.htm
Где воплощено это так)) но не работает у меня) Логика мне показалась следующей: KeyFileld -Поле (вертикальная), idx (GridView1.SelectedIndex) - Запись(горизантальная) она применяется к KeyFileld и возвращает значение ячейки на перекрестии в Лебл)
в лбом случае у меня заработало.. нашел тут информацию))
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref16/html/E_System_Web_UI_WebControls_GridView_RowCommand.htm
Огромное спасибо!!
[off]добавлено спустя 19 минут:[/off]
Только вот такое интересный момент значицо обнаружен...
Все нормально значения берутся из ячейки и выводятся в лейбл... НО!
мне нужно получить Text LinkButton'a - того самого контрола по которому срабатывает Row_Command! Значение это получить не удается в отличие от зачения ЛЮБОЙ другой яччейки... я подумал и доабавил еше один BoundField , дублирующее значение LinkButton'a и естественно ему задал Visible=false.... ну и естественно в таком состтояниизначение получить не удается... как быть не подскажите?:)))
- MXC
- Продвинутый
- Сообщения: 267
- Зарегистрирован: Чт сен 18, 2003 03:32
- Откуда: Кишингтаун
- Контактная информация:
Злобный,
Логично))) ноо собственно INput Type это вронг для Gridview которая выглядет так вот:
На ней 4 кколонки.. 1 -й из которых мне нужен инвизибл)) я пока сделал следующее - Созда в цсс стиль с прозрачным цветом шрифта...
как собсвенно <INPUT > сбда вставить?:))
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" Width="830px" OnRowCommand="GridView1_RowCommand" AllowPaging="True" DataKeyNames="Company" CellPadding="3">
<Columns>
<asp:BoundField DataField="Company" InsertVisible="False">
<ItemStyle CssClass="Hidden" Width="0px" />
<HeaderStyle Width="0px" />
</asp:BoundField>
<asp:BoundField DataField="Text" HeaderText="Прайс-строка" >
<ItemStyle CssClass="SimpleText" Width="235px" />
<HeaderStyle CssClass="NewsName" Width="235px" />
</asp:BoundField>
<asp:BoundField DataField="Price" HeaderText="Цена" >
<ItemStyle CssClass="SimpleText" Width="235px"/>
<HeaderStyle CssClass="NewsName" Width="235px" />
</asp:BoundField>
<asp:BoundField DataField="Tel" HeaderText="Телефон" >
<ItemStyle CssClass="SimpleText" Width="235px" />
<HeaderStyle CssClass="NewsName" Width="235px" />
</asp:BoundField>
<asp:ButtonField DataTextField="Company" HeaderText="Компания" Text="Button" CommandName="Select">
<HeaderStyle CssClass="NewsName" Width="235px" />
<ItemStyle Width="235px" />
</asp:ButtonField>
</Columns>
<RowStyle CssClass="SimpleText" BorderStyle="None" BorderWidth="0px" />
<SelectedRowStyle CssClass="SimpleText" />
<PagerSettings Mode="NextPrevious" />
<FooterStyle CssClass="HeadLine" />
<PagerStyle CssClass="HeadLine" />
<PagerTemplate>
</PagerTemplate>
<EditRowStyle BorderWidth="1px" />
<AlternatingRowStyle BorderStyle="None" />
</asp:GridView>
Логично))) ноо собственно INput Type это вронг для Gridview которая выглядет так вот:
На ней 4 кколонки.. 1 -й из которых мне нужен инвизибл)) я пока сделал следующее - Созда в цсс стиль с прозрачным цветом шрифта...
как собсвенно <INPUT > сбда вставить?:))
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" Width="830px" OnRowCommand="GridView1_RowCommand" AllowPaging="True" DataKeyNames="Company" CellPadding="3">
<Columns>
<asp:BoundField DataField="Company" InsertVisible="False">
<ItemStyle CssClass="Hidden" Width="0px" />
<HeaderStyle Width="0px" />
</asp:BoundField>
<asp:BoundField DataField="Text" HeaderText="Прайс-строка" >
<ItemStyle CssClass="SimpleText" Width="235px" />
<HeaderStyle CssClass="NewsName" Width="235px" />
</asp:BoundField>
<asp:BoundField DataField="Price" HeaderText="Цена" >
<ItemStyle CssClass="SimpleText" Width="235px"/>
<HeaderStyle CssClass="NewsName" Width="235px" />
</asp:BoundField>
<asp:BoundField DataField="Tel" HeaderText="Телефон" >
<ItemStyle CssClass="SimpleText" Width="235px" />
<HeaderStyle CssClass="NewsName" Width="235px" />
</asp:BoundField>
<asp:ButtonField DataTextField="Company" HeaderText="Компания" Text="Button" CommandName="Select">
<HeaderStyle CssClass="NewsName" Width="235px" />
<ItemStyle Width="235px" />
</asp:ButtonField>
</Columns>
<RowStyle CssClass="SimpleText" BorderStyle="None" BorderWidth="0px" />
<SelectedRowStyle CssClass="SimpleText" />
<PagerSettings Mode="NextPrevious" />
<FooterStyle CssClass="HeadLine" />
<PagerStyle CssClass="HeadLine" />
<PagerTemplate>
</PagerTemplate>
<EditRowStyle BorderWidth="1px" />
<AlternatingRowStyle BorderStyle="None" />
</asp:GridView>
Можно воспользоваться темплэйтной колонкой:
Но, на мой взгляд, Вы преувеличиваете сложность и задачи, и решения. Ваш линктекст можно было найти и первый способом, который я указал. Применив ту же маску на исходные данные, которую вы накладывали для получения самого текста линка в гриде, когда грид строится.
Еще один вариант решения - вынос обработки нажатия этого линка на клиент, в JS. Пишете скриптовую функцию, которая берет значение линка из грида и присваивает его лэйблу. Это самое оптимальное решение, поскольку не происходит постбэков - экономится траффик, серверное время, увеличивается скорость отклика. Но годится только в том случае, если вся функциональность этой кнопки ограничивается установкой этого лэйбла.
Код: Выделить всё
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowCommand="GridView1_RowCommand">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="lnkMyLink" runat="server" Text='<%# Eval("Name") %>'/><input type="hidden" id="hdnDuplicate" runat="server" value='<%# Eval("Name") %>'/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Еще один вариант решения - вынос обработки нажатия этого линка на клиент, в JS. Пишете скриптовую функцию, которая берет значение линка из грида и присваивает его лэйблу. Это самое оптимальное решение, поскольку не происходит постбэков - экономится траффик, серверное время, увеличивается скорость отклика. Но годится только в том случае, если вся функциональность этой кнопки ограничивается установкой этого лэйбла.