Добраться до значения в GridView ASP.NET 2.0

Модератор: Злобный

Ответить
Аватара пользователя
MXC
Продвинутый
Сообщения: 267
Зарегистрирован: Чт сен 18, 2003 03:32
Откуда: Кишингтаун
Контактная информация:

Добраться до значения в GridView ASP.NET 2.0

Сообщение MXC »

Есть 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();
}

Выводитчся пустое значение((( что я делаю не так?
Аватара пользователя
Злобный
Завсегдатай
Сообщения: 2716
Зарегистрирован: Сб июн 18, 2005 21:05
Контактная информация:

Сообщение Злобный »

А кто тебе сказал, что этот ивент выстрелит? Дебаггер тебе на что? Поставь точку останова и посмотри, зайдет ли программа в твой обработчик события. Это раз. При нажатии на линк в гриде стреляет "RowCommand". Это два. Ты индекс выбранной строки получаешь (idx), а потом его используешь в DataKeys (что является колонками грида). Какое отношение строка имеет к колонке? В общем, тут достаточно причин для того, чтобы твой пример не работал.

Чтобы работал, используй событие "RowCommand", твой датасурс лучше скэшировать на сервере и при обработке события получать индекс строки, вызвавшей событие (он будет в e.CommandArgument). По этому индексу брать из датасурса строку, из нее - свои данные. Но если в одной строке больше одной кнопки, требующей такой обработки, процесс немного усложнится. Придется добавить к каждой CommandName, по которому потом выбирать, из какой колонки брать данные.
Аватара пользователя
MXC
Продвинутый
Сообщения: 267
Зарегистрирован: Чт сен 18, 2003 03:32
Откуда: Кишингтаун
Контактная информация:

Сообщение MXC »

Собственно часть кода взята отсюда:
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.... ну и естественно в таком состтояниизначение получить не удается... как быть не подскажите?:)))
Аватара пользователя
Злобный
Завсегдатай
Сообщения: 2716
Зарегистрирован: Сб июн 18, 2005 21:05
Контактная информация:

Сообщение Злобный »

MXC,
:) <INPUT type="hidden" id="hdnValue" runat="server"> - как замена твоей невидимой колонки, значения в которой при постбэке и не может быть, поскольку состояние грида поднимается из вьюстэйта, который пришел с клиента, а туда (на клиент) эта колонка отправлена не была, поскольку она невидимая. :)
Аватара пользователя
MXC
Продвинутый
Сообщения: 267
Зарегистрирован: Чт сен 18, 2003 03:32
Откуда: Кишингтаун
Контактная информация:

Сообщение MXC »

Злобный,
Логично))) ноо собственно 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>
&nbsp;
</PagerTemplate>
<EditRowStyle BorderWidth="1px" />
<AlternatingRowStyle BorderStyle="None" />
</asp:GridView>
Аватара пользователя
Злобный
Завсегдатай
Сообщения: 2716
Зарегистрирован: Сб июн 18, 2005 21:05
Контактная информация:

Сообщение Злобный »

Можно воспользоваться темплэйтной колонкой:

Код: Выделить всё

<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. Пишете скриптовую функцию, которая берет значение линка из грида и присваивает его лэйблу. Это самое оптимальное решение, поскольку не происходит постбэков - экономится траффик, серверное время, увеличивается скорость отклика. Но годится только в том случае, если вся функциональность этой кнопки ограничивается установкой этого лэйбла.
Ответить

Вернуться в «Программирование»