Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Индекс пункта контекстного меню в VB.Net Добавлено: 04.10.08 15:59  

Автор вопроса:  DLF
Здравствуйте. Подскажите, можно ли стандартными средствами VB 2008 определить порядковый номер пункта контекстного меню (индекс)? Пункты меню заранее не определены и добавляются в пустое контекстное меню во время выполнения программы. Идея такая: при запуске программа определяет количество и имена CD или DVD приводов на компьютере. Информация заносится в контекстное меню PictureBox-a для последующего использования для закрытия-открытия выбранного или всех существующих приводов.

Ответить

  Ответы Всего ответов: 16  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 04.10.08 16:26
MenuStrip.MenuItems.IndexOf(...)

Ответить

Номер ответа: 2
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #2 Добавлено: 04.10.08 16:27
Подскажите, можно ли стандартными средствами VB 2008 определить порядковый номер пункта контекстного меню (индекс)?

Определить можно, но привязываться к индексу - это не совсем корректно. В коллекции пунктов меню есть свойство IndexOf - оно вернет тебе индекс переданного пункта меню.
Целесообразней было бы при добавлении пункта меню записать в его свойство Tag какой либо идентификатор(число или строку или что либо другое на твой вкус), чтобы в последствии в событии Click считать его и однозначно идентифицировать кликнутый пункт меню

Ответить

Номер ответа: 3
Автор ответа:
 DLF



Вопросов: 9
Ответов: 53
 Профиль | | #3 Добавлено: 04.10.08 16:47
Уважаемые, спасибо за ответ! Буду пробовать.

Ответить

Номер ответа: 4
Автор ответа:
 DLF



Вопросов: 9
Ответов: 53
 Профиль | | #4 Добавлено: 04.10.08 20:57
Да... Видно клепки в голове у меня не хватает. Промучался, но ничего толкового сделать не смог. Учусь в основном на примерах, так как книг по Net не имеется. Приведу пример кода, может поможете.

Public Class Form1
    ;Dim drive As New WMPLib.WindowsMediaPlayer
    ;Dim total, n As Integer

    Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        total = 0
        n = 0
        total = drive.cdromCollection.count ' <<< Количество приводов в системе
        If (total >= 1) Then
            For i = 0 To (total - 1) ' <<< Добавление в контекстное меню
                ContextMenuStrip1.Items.Add(drive.cdromCollection.Item(i).driveSpecifier)
            Next
        End If
    End Sub

    Private Sub ContextMenuStrip1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ContextMenuStrip1.Click
        drive.cdromCollection.Item(0).eject() ' <<< Открывается первый привод. Если (1), то второй
    End Sub

End Class

Ответить

Номер ответа: 5
Автор ответа:
 DLF



Вопросов: 9
Ответов: 53
 Профиль | | #5 Добавлено: 04.10.08 20:59
Смайлики откуда-то появились вместо ";D" ...

Ответить

Номер ответа: 6
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #6 Добавлено: 04.10.08 23:05

using System;
using System.Windows.Forms;
using WMPLib; //References: Interop.WMPLib.dll

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private IWMPCdromCollection drives = null;

        public Form1()
        {
            InitializeComponent();
            // получаем коллекцию приводов
            drives = new WindowsMediaPlayer().cdromCollection;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            if (drives.count != 0)
            {
                for (int i = 0; i < drives.count; i++)
                {
                    // получаем ссылку на привод
                    IWMPCdrom drive = drives.Item(i);
                    // создаем элемент меню
                    ToolStripMenuItem item = new ToolStripMenuItem(drive.driveSpecifier);
                    // запоминаем указатель на привод
                    item.Tag = drive;
                    //item.Image= какая нибудь картинка;
                    // добавляем элемент меню в коллекцию
                    contextMenuStrip1.Items.Add(item);
                }
            }
        }

        private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            // получаем ссылку на привод из элемента меню по которому кликнули
            IWMPCdrom drive = (IWMPCdrom)e.ClickedItem.Tag;
            // open drive
            if (drive != null) drive.eject();
        }
    }
}

Ответить

Номер ответа: 7
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #7 Добавлено: 04.10.08 23:06
  1.  
  2. using System;
  3. using System.Windows.Forms;
  4. using WMPLib; //References: Interop.WMPLib.dll
  5.  
  6. namespace WindowsFormsApplication1
  7. {
  8.     public partial class Form1 : Form
  9.     {
  10.         private IWMPCdromCollection drives = null;
  11.  
  12.         public Form1()
  13.         {
  14.             InitializeComponent();
  15.             // получаем коллекцию приводов
  16.             drives = new WindowsMediaPlayer().cdromCollection;
  17.         }
  18.  
  19.         private void Form1_Load(object sender, EventArgs e)
  20.         {
  21.             if (drives.count != 0)
  22.             {
  23.                 for (int i = 0; i < drives.count; i++)
  24.                 {
  25.                     // получаем ссылку на привод
  26.                     IWMPCdrom drive = drives.Item(i);
  27.                     // создаем элемент меню
  28.                     ToolStripMenuItem item = new ToolStripMenuItem(drive.driveSpecifier);
  29.                     // запоминаем указатель на привод
  30.                     item.Tag = drive;
  31.                     //item.Image= какая нибудь картинка;
  32.                     // добавляем элемент меню в коллекцию
  33.                     contextMenuStrip1.Items.Add(item);
  34.                 }
  35.             }
  36.         }
  37.  
  38.         private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
  39.         {
  40.             // получаем ссылку на привод из элемента меню по которому кликнули
  41.             IWMPCdrom drive = (IWMPCdrom)e.ClickedItem.Tag;
  42.             // open drive
  43.             if (drive != null) drive.eject();
  44.         }
  45.     }
  46. }
  47.  

Ответить

Номер ответа: 8
Автор ответа:
 DLF



Вопросов: 9
Ответов: 53
 Профиль | | #8 Добавлено: 05.10.08 00:43
EROS, попробовал переконвертировать твой пример на VB.Net, но ничего не получилось.
Можешь дать пример на VB.Net, пожалуйста. Очень нужно.

Ответить

Номер ответа: 9
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #9 Добавлено: 05.10.08 00:59
Ничего срашного, если я вместо EROS(a)
  1. Imports System
  2. Imports System.Windows.Forms
  3. Imports WMPLib
  4. 'References: Interop.WMPLib.dll
  5. Namespace WindowsFormsApplication1
  6.     Public Partial Class Form1
  7.         Inherits Form
  8.         Private drives As IWMPCdromCollection = Nothing
  9.         
  10.         Public Sub New()
  11.             InitializeComponent()
  12.             ' получаем коллекцию приводов
  13.             drives = New WindowsMediaPlayer().cdromCollection
  14.         End Sub
  15.         
  16.         Private Sub Form1_Load(sender As Object, e As EventArgs)
  17.             If drives.count <> 0 Then
  18.                 For i As Integer = 0 To drives.count - 1
  19.                     ' получаем ссылку на привод
  20.                     Dim drive As IWMPCdrom = drives.Item(i)
  21.                     ' создаем элемент меню
  22.                     Dim item As New ToolStripMenuItem(drive.driveSpecifier)
  23.                     ' запоминаем указатель на привод
  24.                     item.Tag = drive
  25.                     'item.Image= какая нибудь картинка;
  26.                     ' добавляем элемент меню в коллекцию
  27.                     contextMenuStrip1.Items.Add(item)
  28.                 Next
  29.             End If
  30.         End Sub
  31.         
  32.         Private Sub contextMenuStrip1_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs)
  33.             ' получаем ссылку на привод из элемента меню по которому кликнули
  34.             Dim drive As IWMPCdrom = DirectCast(e.ClickedItem.Tag, IWMPCdrom)
  35.             ' open drive
  36.             If drive IsNot Nothing Then
  37.                 drive.eject()
  38.             End If
  39.         End Sub
  40.     End Class
  41. End Namespace

Ответить

Номер ответа: 10
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #10 Добавлено: 05.10.08 01:01
Упс. Без всяких мыслей пожалуйста. Смайлик появился сам.

Ответить

Номер ответа: 11
Автор ответа:
 DLF



Вопросов: 9
Ответов: 53
 Профиль | | #11 Добавлено: 05.10.08 09:33
К сожалению не работает этот код. Появляется пустая форма без PictureBox-a и контекстного меню. Есть другой рабочий вариант, но там простое контекстное меню.

Public Class Form1
    ;Dim CMenu As New ContextMenu

    ;Dim drive As New WMPLib.WindowsMediaPlayer
    ;Dim total, n As Integer

    Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        total = 0
        n = 0
        total = drive.cdromCollection.count
        If (total >= 1) Then
            For i = 0 To (total - 1)
                CMenu.MenuItems.Add(drive.cdromCollection.Item(i).driveSpecifier, AddressOf MItem_Click)
            Next
        End If
        ContextMenu = CMenu
    End Sub

    Sub MItem_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        ;Dim MItem As MenuItem = DirectCast(sender, MenuItem)
        drive.cdromCollection.Item(MItem.Index).eject()
    End Sub

End Class

Ответить

Номер ответа: 12
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #12 Добавлено: 05.10.08 10:33
К сожалению не работает этот код

Код работает, иначе бы его здесь не постили.. Если ты не в состоянии кинуть на форму PictureBox и СontextMenuStrip, а также в свойствах PictureBox указать какой СontextMenu использовать, то тебе надо не с CD-ROM разбираться а садится за книги и долго-долго их читать. Если просветление не наступит то, перечитать книги заново, а не кричать тут что код не работает!

Ответить

Номер ответа: 13
Автор ответа:
 DLF



Вопросов: 9
Ответов: 53
 Профиль | | #13 Добавлено: 05.10.08 13:21
Еще раз скопировал в проект. В код добавляются дополнительные строки:

Imports System
Imports System.Windows.Forms
Imports WMPLib
'References: Interop.WMPLib.dll
Namespace WindowsFormsApplication1
    Partial Public Class Form1
        Inherits Form
        Private drives As IWMPCdromCollection = Nothing

        Public Sub New()
            InitializeComponent()
            ' получаем коллекцию приводов
            drives = New WindowsMediaPlayer().cdromCollection
        End Sub

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
            If drives.count <> 0 Then
                For i As Integer = 0 To drives.count - 1
                    ' получаем ссылку на привод
                    ;Dim drive As IWMPCdrom = drives.Item(i)
                    ' создаем элемент меню
                    ;Dim item As New ToolStripMenuItem(drive.driveSpecifier)
                    ' запоминаем указатель на привод
                    item.Tag = drive
                    'item.Image= какая нибудь картинка;
                    ' добавляем элемент меню в коллекцию
                    contextMenuStrip1.Items.Add(item)
                Next
End If
        End Sub

        Private Sub contextMenuStrip1_ItemClicked(ByVal sender As Object, ByVal e As ToolStripItemClickedEventArgs)
            ' получаем ссылку на привод из элемента меню по которому кликнули
            ;Dim drive As IWMPCdrom = DirectCast(e.ClickedItem.Tag, IWMPCdrom)
            ' open drive
            If drive IsNot Nothing Then
                drive.eject()
            End If
        End Sub
        Friend WithEvents ContextMenuStrip1 As System.Windows.Forms.ContextMenuStrip
        Private components As System.ComponentModel.IContainer
        Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox
        Friend WithEvents AxWindowsMediaPlayer1 As AxWMPLib.AxWindowsMediaPlayer

        Private Sub InitializeComponent()
            Me.components = New System.ComponentModel.Container
            ;Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Form1))
            Me.ContextMenuStrip1 = New System.Windows.Forms.ContextMenuStrip(Me.components)
            Me.PictureBox1 = New System.Windows.Forms.PictureBox
            Me.AxWindowsMediaPlayer1 = New AxWMPLib.AxWindowsMediaPlayer
            CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).BeginInit()
            CType(Me.AxWindowsMediaPlayer1, System.ComponentModel.ISupportInitialize).BeginInit()
            Me.SuspendLayout()
            '
            'ContextMenuStrip1
            '
            Me.ContextMenuStrip1.Name = "ContextMenuStrip1"
            Me.ContextMenuStrip1.Size = New System.Drawing.Size(61, 4)
            '
            'PictureBox1
            '
            Me.PictureBox1.ContextMenuStrip = Me.ContextMenuStrip1
            Me.PictureBox1.Location = New System.Drawing.Point(86, 93)
            Me.PictureBox1.Name = "PictureBox1"
            Me.PictureBox1.Size = New System.Drawing.Size(100, 50)
            Me.PictureBox1.TabIndex = 1
            Me.PictureBox1.TabStop = False
            '
            'AxWindowsMediaPlayer1
            '
            Me.AxWindowsMediaPlayer1.Enabled = True
            Me.AxWindowsMediaPlayer1.Location = New System.Drawing.Point(205, 12)
            Me.AxWindowsMediaPlayer1.Name = "AxWindowsMediaPlayer1"
            Me.AxWindowsMediaPlayer1.OcxState = CType(resources.GetObject("AxWindowsMediaPlayer1.OcxState";), System.Windows.Forms.AxHost.State)
            Me.AxWindowsMediaPlayer1.Size = New System.Drawing.Size(75, 23)
            Me.AxWindowsMediaPlayer1.TabIndex = 2
            '
            'Form1
            '
            Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
            Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
            Me.ClientSize = New System.Drawing.Size(292, 266)
            Me.Controls.Add(Me.PictureBox1)
            Me.Controls.Add(Me.AxWindowsMediaPlayer1)
            Me.Name = "Form1"
            Me.Text = "Form1"
            CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).EndInit()
            CType(Me.AxWindowsMediaPlayer1, System.ComponentModel.ISupportInitialize).EndInit()
            Me.ResumeLayout(False)

        End Sub
    End Class
End Namespace


Выдает ошибку:

Ошибка при создании формы. См. Exception.InnerException. Ошибка: Не удалось найти ресурсы, соответствующие указанной культуре или нейтральной культуре. Проверьте правильность внедрения или связывания "WindowsApplication1.Form1.resources" со сборкой "WindowsApplication1" во время компиляции, или убедитесь, что все необходимые сопутствующие сборки полностью подписаны и могут быть загружены.

Ответить

Номер ответа: 14
Автор ответа:
 DLF



Вопросов: 9
Ответов: 53
 Профиль | | #14 Добавлено: 05.10.08 13:42
На форме присутствует всё, что надо (pictureBox, contextmenustrip...)

Ответить

Номер ответа: 15
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #15 Добавлено: 05.10.08 15:59
Во первых, ты не подключил обработчик для ItemClicked..
Во вторых, мой код к этой ошибке никакого отношения не имеет.. Ты там с ресурсами где то накосячил либо не подключил References: WMPLib.dll ..

Создай НОВЫЙ чистый проект и сделай следующее:
0. Подключи References: WMPLib.dll
1. Кинь на форму PictureBox, ContextMenuStrip
2. В свойствах PictureBox установи ContextMenu
3. Создай обработчик события ItemClicked для ContextMenu1
4. Скопируй недостающие строки в код формы (Следи чтобы с именами контролов не напутал)

Запускай и наслаждайся!

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам