Страница: 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
Определить можно, но привязываться к индексу - это не совсем корректно. В коллекции пунктов меню есть свойство 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
 im drive As New WMPLib.WindowsMediaPlayer
 im 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
Смайлики откуда-то появились вместо "" ...
Номер ответа: 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
Номер ответа: 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
Номер ответа: 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
 im CMenu As New ContextMenu
 im drive As New WMPLib.WindowsMediaPlayer
 im 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)
 im 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
' получаем ссылку на привод
 im drive As IWMPCdrom = drives.Item(i)
' создаем элемент меню
 im 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)
' получаем ссылку на привод из элемента меню по которому кликнули
 im 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
 im 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. Скопируй недостающие строки в код формы (Следи чтобы с именами контролов не напутал)
Запускай и наслаждайся!