ブログ移転?しました エックスサーバを契約してみたので、 いろいろカスタマイズできそうなWordPressを使って ブログを作ってみました。 https://gametech.vatchlog.com/ 多分こちらでも同じような記事を書いていくと思います。 忍者ブログ

ばちブロ

プログラミングとか徒然を書いていた(過去形)

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【C#.NET】ListViewの選択しているインデックスを取得する

【2019/2/20追記】
以下のブログにて書き直しました!
最新の情報は以下参照お願いいたします。

【C#.NET】ListViewで選択しているインデックスを取得する




【2019/3/7】
5秒後に新しいブログの方のリメイク記事へリダイレクトするようにいたしました








-----------------------------------------

さて、WSCardDBの仕様を変更しようとListViewコントロールをいじっている時でした。
ListViewにアイテムの追加をして、FullRowSelectプロパティをtrueにして
選択範囲を列全体に設定して、あとはSelectedIndexChangedイベントで
選択されている項目のインデックスを取得するだけ!

・・・だったのですが、あることに気がつきました。


SelectedIndexプロパティがないっ!!!


ListBoxコントロールには存在する、選択された項目のインデックスを取得したり、
指定したインデックスを選択したりするSelectedIndexプロパティですが、
なぜかListViewにはそのプロパティが存在しませんでした。
なんでや!と思ってgoogle先生に相談してみると、

「SelectedIndexはないけどSelectedItemsの中にIndexプロパティ用意しとるでよ」

と回答を頂きました。
なるほど、と思い早速導入。
以下のようなコードを書きました。

//cardListBoxの項目が選択されたときの処理
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    int idx = 0;
    idx = listView1.SelectedItems[0].Index;
    
MessageBox.Show(
                                    (idx + 1).ToString() + "番目が選択されました。",
                                    "選択されたインデックス",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.None
                                );
}

※listview1はListViewコントロールのインスタンスです。

さあ完成!と思い実行っ
1つ目のListViewの項目を選択すると、無事にメッセージボックスが出現。
なんとか上手く動作しているようです。
調子に乗ってそのまま2つ目の項目を選択!


んんっ!?


ArgumentOutOfRangeException はハンドルされませんでした。
'0' の InvalidArgument=Value は 'index' に対して有効ではありません。
パラメーター名: index

とかいうエラー(例外)が発生してしまいました。
なんのこっちゃいな!
いろいろ検索して調べてみると、どうやら選択項目が切り替わる際に
ListViewItemsのIndexが複雑怪奇(?)な動作をしてしまうようです。
さて、どうしようかと思い、色々ネットで調べてみると、解決方法がありました。
以下のコードに修正。

//cardListBoxの項目が選択されたときの処理修正版
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    int idx = 0;
    if (listView1.SelectedItems.Count > 0)
    {
        idx = listView1.SelectedItems[0].Index;
        MessageBox.Show(
                                        (idx + 1).ToString() + "番目が選択されました。",
                                        "選択されたインデックス",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.None
                                    );
    }
}

はいっ!完成!
どうやら、選択項目を変更するときに、一時的に
listView1.SelectedItems.Count(現在選択されている項目数)が
0以下になってしまうそうです。
それが原因でエラーを引き起こしているみたいだったので、
そのような場合に処理を行わないようにすれば良かったわけです。

いやーよかったよかった・・・
WSCardDB v0.92は無事に明日リリースできそうですね。

拍手[9回]

PR