none
Всплывающая подсказка (ToolTip или 'title' ) на кнопках CommandField в GridView RRS feed

  • Вопрос

  • Доброго всем дня, кто знает как реализовать всплывающую подсказку на кнопках управления (CommandField ) внутри GridView?

    Есть обычный CommandField, тип кнопки - изображение, все вроде хорошо, но без подсказки не обойтись.

    Вот что имеется:

                <asp:CommandField ShowDeleteButton="True"  ButtonType="Image" ShowEditButton="True" NewText="<%$ Resources:siteResources, NewText%>" DeleteText="<%$ Resources:siteResources,DeleteText%>" EditText="<%$ Resources:siteResources, EditText%>" SelectText="<%$ Resources:siteResources, SelectText%>" 
                UpdateText="<%$ Resources:siteResources,UpdateText%>" CancelText="<%$ Resources:siteResources,CancelText%>" CancelImageUrl="~/images/icons/grid/cancel.png" 
                DeleteImageUrl="~/images/icons/grid/cross.png" NewImageUrl="~/images/icons/grid/add.png" UpdateImageUrl="~/images/icons/grid/accept.png"  EditImageUrl="~/images/icons/grid/edit.png">
                
                </asp:CommandField>

    Я уже думал добавить свои кнопки в тег CommandField, но как тогда назначить им соответствующие события + выявить режим редактирования/просмотра, по-моему слишком муторно.

    Скорее всего есть нормальное решение, помогите, пожалуйста, его найти.

                

    15 сентября 2012 г. 19:56

Ответы

  • Нет, почему же. Всё очень просто. Достаточно Вам туда впихнуть три кнопки с соответствующими коммандами

    <asp:LinkButton runat="server" Text="Edit" 
    CommandName="Edit" ID="Linkbutton1" /> 
    

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

    • Помечено в качестве ответа Kutcher 16 сентября 2012 г. 20:37
    16 сентября 2012 г. 19:59
    Модератор
  • В общем, нашел один способ, который вешается на событие RowDataBound, ToolTip для кнопок устанавливается в зависимости от url'а изображения.  

    Не знаю, есть ли другие способы, но мой выглядит в итоге примерно так:

        protected void Grid_RowDataBound1(object sender, GridViewRowEventArgs e)
        {
    
            foreach (TableCell cell in e.Row.Cells)
            {
                foreach (Control ctrl in cell.Controls) // e.Row.Cells[5].Controls
                {
                    if (ctrl is ImageButton)
                    {
                        ImageButton btn = ctrl as ImageButton;
                        if (btn != null)
                        {
                            string ImUrl = btn.ImageUrl;
                            string ToolTip="";
    
                            if (ImUrl.ToLower().Contains("accept")) { ToolTip = "Применить изменения"; }
                            if (ImUrl.ToLower().Contains("add")) { ToolTip = "Добавить запись"; }
                            if (ImUrl.ToLower().Contains("cancel")) { ToolTip = "Отменить"; }
                            if (ImUrl.ToLower().Contains("cross")) { ToolTip = "Удалить запись"; }
                            if (ImUrl.ToLower().Contains("edit")) { ToolTip = "Изменить"; }
                            ((WebControl)ctrl).ToolTip = ToolTip;
                            
                        }
                    }
                }
    
            }
    
        }

    Пришлось ставить еще один foreach с перебором всех TableCell, так как обращение к e.Row.Cells[7].Controls вызывало ошибку (index за границами допустимого диапазона), но почему - я так и не понял, хотя и делал проверку на количество и на null. Может кто-то подскажет на что проверять e.Row, чтобы корректно обратиться к определенному индексу Cells?

    • Помечено в качестве ответа Kutcher 16 сентября 2012 г. 15:45
    15 сентября 2012 г. 21:02
  • Спасибо большое, теперь все работает как надо + подцепил клиентское подтверждение перед удалением.

    Конечный результат(если кому пригодится):

                <asp:TemplateField HeaderText="Управление">
                  <ItemTemplate>
                      <asp:ImageButton ID="EditImageButton" runat="server"  ToolTip="<%$ Resources:siteResources, EditText%>" CommandName="Edit" ImageUrl="~/images/icons/grid/edit.png" />
                      <asp:ImageButton ID="DeleteImageButton" runat="server" ToolTip="<%$ Resources:siteResources,DeleteText%>" CommandName="Delete" ImageUrl="~/images/icons/grid/cross.png" OnClientClick="return confirm('Вы действительно хотите удалить эту запись','Внимание');" />
                  </ItemTemplate>
    
                  <EditItemTemplate>
                      <asp:ImageButton ID="UpdateImageButton" runat="server" ToolTip="<%$ Resources:siteResources,UpdateText%>" CommandName="Update" ImageUrl="~/images/icons/grid/accept.png"  />
                      <asp:ImageButton ID="CancelImageButton" runat="server" ToolTip="<%$ Resources:siteResources,CancelText%>" CommandName="Cancel" ImageUrl="~/images/icons/grid/cancel.png" />
                  </EditItemTemplate>
                
                </asp:TemplateField>

     
    • Помечено в качестве ответа YatajgaEditor 18 сентября 2012 г. 3:56
    17 сентября 2012 г. 21:37

Все ответы

  • В общем, нашел один способ, который вешается на событие RowDataBound, ToolTip для кнопок устанавливается в зависимости от url'а изображения.  

    Не знаю, есть ли другие способы, но мой выглядит в итоге примерно так:

        protected void Grid_RowDataBound1(object sender, GridViewRowEventArgs e)
        {
    
            foreach (TableCell cell in e.Row.Cells)
            {
                foreach (Control ctrl in cell.Controls) // e.Row.Cells[5].Controls
                {
                    if (ctrl is ImageButton)
                    {
                        ImageButton btn = ctrl as ImageButton;
                        if (btn != null)
                        {
                            string ImUrl = btn.ImageUrl;
                            string ToolTip="";
    
                            if (ImUrl.ToLower().Contains("accept")) { ToolTip = "Применить изменения"; }
                            if (ImUrl.ToLower().Contains("add")) { ToolTip = "Добавить запись"; }
                            if (ImUrl.ToLower().Contains("cancel")) { ToolTip = "Отменить"; }
                            if (ImUrl.ToLower().Contains("cross")) { ToolTip = "Удалить запись"; }
                            if (ImUrl.ToLower().Contains("edit")) { ToolTip = "Изменить"; }
                            ((WebControl)ctrl).ToolTip = ToolTip;
                            
                        }
                    }
                }
    
            }
    
        }

    Пришлось ставить еще один foreach с перебором всех TableCell, так как обращение к e.Row.Cells[7].Controls вызывало ошибку (index за границами допустимого диапазона), но почему - я так и не понял, хотя и делал проверку на количество и на null. Может кто-то подскажет на что проверять e.Row, чтобы корректно обратиться к определенному индексу Cells?

    • Помечено в качестве ответа Kutcher 16 сентября 2012 г. 15:45
    15 сентября 2012 г. 21:02
  • Это тоже вариант, как говорится "работает". Но если хотите большей гибкости, то используйте шаблонные столбцы.

    <asp:TemplateField HeaderText="" SortExpression=""> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Bind("выражение") %>' ToolTip ='<%# Bind("выражение") %>'></asp:Label>

    .......................... </ItemTemplate> </asp:TemplateField>

    Можете запихнуть туда что хотите.
    16 сентября 2012 г. 19:06
    Модератор
  • Как в таком случае привязать на событие OnClick (пусть хоть по Label) действие внутреннего обработчика Add,Insert,Delete e.t.c самого грида?

    Т.е. как указать - делай тоже самое что и кнопка Accept или Delete в CommandField? Скорее всего, нужно будет самому писать соответствующий код с проверкой статуса строк и прочее. Или я не прав? 

     
    16 сентября 2012 г. 19:28
  • Нет, почему же. Всё очень просто. Достаточно Вам туда впихнуть три кнопки с соответствующими коммандами

    <asp:LinkButton runat="server" Text="Edit" 
    CommandName="Edit" ID="Linkbutton1" /> 
    

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

    • Помечено в качестве ответа Kutcher 16 сентября 2012 г. 20:37
    16 сентября 2012 г. 19:59
    Модератор
  • Спасибо большое, теперь все работает как надо + подцепил клиентское подтверждение перед удалением.

    Конечный результат(если кому пригодится):

                <asp:TemplateField HeaderText="Управление">
                  <ItemTemplate>
                      <asp:ImageButton ID="EditImageButton" runat="server"  ToolTip="<%$ Resources:siteResources, EditText%>" CommandName="Edit" ImageUrl="~/images/icons/grid/edit.png" />
                      <asp:ImageButton ID="DeleteImageButton" runat="server" ToolTip="<%$ Resources:siteResources,DeleteText%>" CommandName="Delete" ImageUrl="~/images/icons/grid/cross.png" OnClientClick="return confirm('Вы действительно хотите удалить эту запись','Внимание');" />
                  </ItemTemplate>
    
                  <EditItemTemplate>
                      <asp:ImageButton ID="UpdateImageButton" runat="server" ToolTip="<%$ Resources:siteResources,UpdateText%>" CommandName="Update" ImageUrl="~/images/icons/grid/accept.png"  />
                      <asp:ImageButton ID="CancelImageButton" runat="server" ToolTip="<%$ Resources:siteResources,CancelText%>" CommandName="Cancel" ImageUrl="~/images/icons/grid/cancel.png" />
                  </EditItemTemplate>
                
                </asp:TemplateField>

     
    • Помечено в качестве ответа YatajgaEditor 18 сентября 2012 г. 3:56
    17 сентября 2012 г. 21:37
  • Спасибо, что поделились решением.


    Для связи [mail]

    18 сентября 2012 г. 7:28
    Модератор