Изменение текста кнопки ссылки в gridview динамически на основе значения столбца

#c# #asp.net

#c# #asp.net

Вопрос:

Я из PHP. У меня есть следующий код для GridView, который заполняется из базы данных. Я хочу изменить текст кнопки ссылки на основе значения столбца состояния в сетке. Например, если значение столбца состояния равно «ожидание», то кнопка ссылки должна отображать текст Edit Details вместо View Details . Как мне это сделать?

 <asp:GridView ID="empres1" 
    runat="server" 
    AllowPaging="True" 
    AutoGenerateColumns="False" 
    onrowcommand="empres1_RowCommand" 
    onrowediting="empres1_RowEditing" 
    onselectedindexchanged="empres1_SelectedIndexChanged1">

        <asp:BoundField DataField="Status" HeaderText="Status" />
        <asp:BoundField DataField="comments" HeaderText="comments"   />
        <asp:TemplateField HeaderText="" SortExpression="">  
            <ItemTemplate>   
                <asp:LinkButton ID="LinkButtonEdit" runat="server" 
                    CommandName="ShowPopup" 
                    CommandArgument='<%#Eval("EmployeeId") %>'>View Details
                </asp:LinkButton> 
                                                 -------------------^
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
 

Ответ №1:

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

     protected void empres1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        LinkButton button =
        e.Row.Cells[2].FindControl("LinkButtonEdit");
        if (button != null)
        {
            DataRow dr = e.Row.DataItem;
            if (dr["status"].ToString() == "Pending")
            {
                button.Text = "Edit Details";
            }
            else
            {
                button.Text = "View Details";
            }
        }

    }
}
 

Код может быть синтаксически несовершенным, но вы могли бы получить представление об этом.

Ответ №2:

Вы можете использовать событие на стороне сервера для представления сетки:

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

 if(e.Row.RowType == DataControlRowType.DataRow)  // (1)
{
  // modify the row here
}
 

(1) при этом пропускаются верхние и нижние колонтитулы, так что код выполняется только для «обычных» строк

В // modify the row here вы можете получить доступ к элементам управления внутри строки и изменить их.

В качестве альтернативы можно использовать GridView.Событие RowDataBound, содержащее информацию о данных, переданных в строку (аналогично предыдущему образцу).

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

  • Cells : ячейки (столбцы) строки
  • Controls : элементы управления внутри строки
  • DataItem : это позволяет вам получить доступ к данным, привязанным к этому маршруту (вы можете использовать отладчик, чтобы посмотреть, как он может выполнить необходимое приведение)

Процесс будет заключаться в просмотре данных в DataItem , и поиске элемента управления (или ячейки), который вам нужно изменить. (Я настаиваю на использовании точки останова в отладчике для просмотра значений свойств… они немного громоздкие, особенно элемент данных).