VB2008で作成しています。
IDとPASSを管理する『ロボフォーム』のようなものを製作しようとしています。
登録した情報をMenuStripに追加していきたいのですが、理由は階層になっているのでTreeViewより見やすいとおもったからです。
仕様はURLやID/PASSを登録しておいて、MenuStripより選びIEが立ち上がりといった感じです。
データーを読み込んでMenuStripに追加していきたいのですが
どのような保存形式にしたらよいですか?
もともとPHPなどをしていましたので、CSVやDAT形式のファイルを追加していってデーター蓄積を使用かとおもっています。
それともMenuStripを仕様することは間違っていますか?
MenuStripの良いところはショートカットキーが簡単に使える
ところですが、件数が多くなると動作が遅くなったり、不安定に
なる気がします。あくまでも「気」ですが。
あまりトリッキーなことは止めて、やはりここはTreeViewerでは。
保存方法は迷わず、XMLによるシリアライズでしょう。
なるほどぉ〜。
From自体はデスクトップのアイコンくらいの大きさでマウスを持ってった時にMenuStripだとFormの外に飛び出してくれるので邪魔にならないアプリが出来ると考えていました。
MenuStripのToolStripMenuItemをCSVから読み込んで表示するようなことはできませんでしょうか?
保存形式はXMLでもCSVでも良いのですが、CSVの方がファイルが軽くてすむので読み込みもCSVの方が早いと思ってたのですが・・・チガウノカナ。。。
>MenuStripのToolStripMenuItemをCSVから読み込んで表示するようなことはできませんでしょうか?
出来んことは無いでしょう、ただCSV形式には階層という概念がありませんから、自分で
ゴリゴリ作ることになりますね。
>CSVの方がファイルが軽くてすむので読み込みもCSVの方が早いと思ってたのですが...
完全に誤差の範囲ですね。
データーが大量にある場合は、固定長が早いと思いますが、かなり非力なマシンでも
数十メガバイト以上無いと差が出ないでしょう。
確かにCSV形式には階層という概念がないためゴリゴリになるかもですねぇ〜
例えばれすが。
test.csv
名前,年齢,都道府県,
penko,22,osaka,
penta,23,tokyo,
penpen,21,kyoto,
この名前だけをToolStripMenuItemに入れていってクリックした場合
例えばtextboxにpenko,22,osaka,と表示するようなスクリプトいただけませんか?
スクリプトと言ったって.....(^^;
public partial class Form1 : Form
{
ArrayList myAL = new ArrayList();
public Form1()
{
InitializeComponent();
using (StreamReader sr = new StreamReader("C:\\Test.csv"))
{
String line;
int i = 0 ;
while ((line = sr.ReadLine()) != null)
{
if (i != 0) //一行目パス
{
myAL.Add (line);
string[] sData = line.Split(',');
menuStrip1.Items.Add(sData[0]);
}
i++;
}
}
}
private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
for (int i = 0; i < myAL.Count ; i++)
{
string[] sData = ((string)myAL[i]).Split(',');
if (sData[0] == e.ClickedItem.ToString())
{
textBox1.Text = (string)myAL[i];
return;
}
}
}
}
↑VC#じゃないですか?
VB2008なんですけども・・・
あああ・・・ 間違った!
Imports System.io
Public Class Form1
Dim myAl As New ArrayList
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim sr As StreamReader = New StreamReader("c:\Test.csv")
Dim line As String
Dim i As Integer = 0
Do
line = sr.ReadLine()
If i <> 0 And line <> "" Then '一行目パス
myAl.Add(line)
Dim sData() As String = line.Split(",")
MenuStrip1.Items.Add(sData(0))
End If
i += 1
Loop Until (line Is Nothing)
sr.Close()
End Sub
Private Sub MenuStrip1_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles MenuStrip1.ItemClicked
For i As Integer = 0 To myAL.Count - 1
Dim sData() As String = myAl(i).Split(",")
If sData(0) = e.ClickedItem.ToString() Then
TextBox1.Text = DirectCast(myAl(i), String)
Return
End If
Next
End Sub
End Class
多分これで。
e.ClickedItem.
でエラが・・・・
どんなエラーが出るの?
VB2005しか無いんで、VB2008って正式発売は2月8日だったっけ。
Split(",")はSplit(CChar(",")これの方が良いかも。
e.ClickedItemはSystemEventArgeのメンバーではありません。
と青い波下線が表示されます。
MenuStripは貼り付けてるよね。
今度は自分のHN間違った。
埋め込むところ間違ってましたw
動いたのですが・・・・
まず、文字化けと。
横一列に表示されるのと・・・
『希望』
[penpen]
[penko]
[penta]
『現状』
[penpenpenkopenta]←文字化け。
何度もすいませんw
昨日は最悪でした、雪は降るし、頭は痛いし...(^^;
この件早く済ましてしまいましょう。
文字化けはあなたがtextファイルをUnicodeで保存していないからです。
メモ帳で保存するとき、「文字コード」でUnicodeを指定してください。
フォームにMenuStripとTextBoxを貼り付けて、MenuStripの一番上のレベルに
「Name」と入れて下さい。
一応ArryListはジェネリクスにしました。
ファイルの処理はUsingを使いました。
何か問題が有ったら後はご自分で....
Option Strict On
Imports System.io
Public Class Form1
Dim myAl As New System.Collections.Generic.List(Of String)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
Using sr As StreamReader = New StreamReader("c:\Test.csv")
Dim line As String
Dim i As Integer = 0
Do
line = sr.ReadLine()
If line = "" Then
Exit Do
End If
Dim sData() As String = line.Split(CChar(","))
If i = 0 Then
Me.NameToolStripMenuItem.Text = sData(0)
Else
myAl.Add(line)
Me.NameToolStripMenuItem.DropDownItems.Add(sData(0))
End If
i += 1
Loop Until (line Is Nothing)
End Using
End Sub
Private Sub NameToolStripMenuItem_DropDownItemClicked _
(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) _
Handles NameToolStripMenuItem.DropDownItemClicked
For i As Integer = 0 To myAl.Count - 1
Dim sData() As String = myAl(i).Split(CChar(","))
If sData(0) = e.ClickedItem.ToString() Then
TextBox1.Text = DirectCast(myAl(i), String)
Return
End If
Next
End Sub
End Class
ジェネリクスにしたんで、キャストな必要ないですね。
× TextBox1.Text = DirectCast(myAl(i), String)
○ TextBox1.Text = myAl(i)
Meが付いたり付かなかったりしてるけど無視してね。
ほんとに沢山ありがとうございましたw
我龍院 様には感謝感激でございます。
これからもよろしくお願いします。
あぁぁぁぁぁ、だめだぁ。
私、ダメな子です。。。
ループで追加されたToolStripMenuItemをクリックして、データーTEXTBOXに表示したいんですが、MenuStrip1はPrivate SubあるからプログラムかけますがToolStripMenuItemのPrivate Subがないのでどうやってかいたらいのでしょう???
ちなみにこのテの事は市販されている辞書に書いてないです、みなさん、どこでしらべてるんですか?
このへんが参考になるかと思います。
方法 : ToolStrip の項目を動的に追加する
http://msdn2.microsoft.com/ja-jp/library/ms229625.aspx
ポイントは AddHandler 、AddressOf のあたりです。
> みなさん、どこでしらべてるんですか?
例えば今回のケースであれば、「ToolStripMenuItem 動的追加」で検索すると、
割と簡単に出てきます。
ですので、この状況を「動的追加」と呼ぶということを知っているかどうかが
ポイントになるんですね。
プログラミングに使う専門用語を多く、正確に知れば知るほど探しやすくなりますし、
どんなことができそうで何が無理そうかの勘も働くようになってきます。
そのためには、とにかく多く「読む」ことをお勧めします。
まずはVBに付属しているヘルプや、上記リンク先のmsdnオンラインから。
目次を全部開いておもしろそうなところは全部読むくらいな勢いで。
これだけでもノウハウの宝庫ですよ。
さるべーじ様ありがとうございます、いろいろ見てました。
むずかしですねぇ、順番に紐解いていくしかないようです・・・
oolStripMenuItemを選択してTEXTBOXに内容表示するにはどこに動書けば良いのかまだ、わかりません・・・
あれ、我龍院さんのコードをよく見ると、
「ToolStripMenuItemをクリックして、データをTextBoxに表示させる」
ところまでちゃんと書いてありますね。
NameToolStripMenuItem_DropDownItemClickedイベントの中で、
(1) クリックされた項目を「e.ClickedItem.ToString」で特定し、
(2) 同じ頭を持つデータをmyAlから探し出して、
(3) TextBox1.Textに格納しています。
これなら無理にToolStripMenuItemそのもののイベントは要りませんよ。
一度、提示いただいたコードをそのまま実行して、動作を確認してみてはいかがでしょうか。
あれ、なんかまだおかしいな。
> ToolStripMenuItemのPrivate Subがない
という部分で行き詰っているんでしょうか。
> フォームにMenuStripとTextBoxを貼り付けて、
> MenuStripの一番上のレベルに「Name」と入れて下さい。
ということですので、Formはこんな感じになるはずです。
http://salv.miscnotes.com/2008/02/20080205_01.png
コードを書く前にMenuStripに「Name」と入力しておくと、
NameToolStripMenuItemができますので、
「Private Sub NameToolStripMenuItem_DropDownItemClicked」が
記述できるようになると思うんですが。
ツイート | ![]() |