簡體   English   中英

填寫列表視圖和圖像列表選擇項目混淆c#

[英]Filling Listview & Imagelist selected item confusion c#

我是編程和C#的新手,似乎已經讓自己陷入了上述困境。 我想要做的是創建一個客廳媒體電腦的前端沒有什么可以開始的,因為我明白這是一個像我這樣的完全noobie的媽媽的任務。 我已經拍完了,完全可以使用外部exe,存儲/加載資源......並且對我2周沖浪的結果非常滿意。

所以我開始我的項目只是啟動一個模擬器開始,我想要做的是掃描文件夾中的zip文件和圖像文件,如果找到匹配的圖像和zip文件,它會在列表視圖中顯示每個拉鏈發現。

所以我填充這樣的列表框,讓我的2個列表框顯示我想看的東西。

PopulateListBox(listBox1, "\\SomePath\\", "*.zip");
PopulateListBox(listBox2, "\\Images\\", "*.jpg");

private void PopulateListBox(ListBox lsb, string Folder, string FileType)
    {
        DirectoryInfo dinfo = new DirectoryInfo(Folder);
        FileInfo[] Files = dinfo.GetFiles(FileType);
        foreach (FileInfo file in Files)
        {
            lsb.Items.Add(file.Name);
        }
    }

所以我現在有了我的2個列表框,可以看到我有game1.zip和game1.jpg,現在我可以使用game1圖像填充我的listview並啟動他說簡單的模擬器。

這就是我目前填充列表視圖的方式。

 PopulateListView();
 private void PopulateListView()
 {
  if (listBox1.Items.Contains("game1.zip"))
 {
   if (File.Exists("\\Images\\game1.jpg"))
    {
     imageList1.Images.Add(Image.FromFile("\\Images\\game1.jpg"));
     listView1.Items.Add("", 0);
    }
 }

 if (listBox1.Items.Contains("game2.zip"))
 {
   if (File.Exists("\\Images\\game2.jpg"))
    {
     imageList1.Images.Add(Image.FromFile("\\Images\\game2.jpg"));
     listView1.Items.Add("", 1);
    }
 }
}

這就是我目前正在推出的方式,它運作正常。

 // launch item
 private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
 {
   if (listView1.Items[0].Selected == true)
    {
      string rom = "\\" + listBox1.Items[0].ToString();
      // Launch code in here
    }

    if (listView1.Items[1].Selected == true)
     {
       string rom = "\\" + listBox1.Items[1].ToString();
       // Launch code in here
     }
    }

那你可能會問什么問題? 而不是繼續輸入每個項目的所有信息我想要使用某種聲明,如果可能,我不知道搜索哪些沒有幫助。 圖像名稱將始終與zip名稱匹配,只需要松開文件擴展名,以便填充listview這樣的東西。

if (listbox1 item = listbox2 item)
 {
  add to imagelist and listview automaticly with same index
 } 

然后我希望能夠使用這樣的東西啟動。

 private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
 {
      string rom = "\\" + listview.selected.item.tostring;
      // Launch code in here
 }

希望我在我的智慧結束時有意義。

問候

德里克

如果我理解正確,您希望以編程方式讀取,匹配和顯示所有相同的圖像和拉鏈,以及當用戶單擊列表視圖行以啟動ROM時。 這可以按如下方式完成:

  • 讀取所有圖像 - 無需檢查文件是否存在,因為如果不存在,則GetFiles將無法找到它!
  • 閱讀所有roms - 與上面相同!
  • 取所有同時包含圖像和zip文件的名稱(相同)
  • 同時填充圖像列表和列表視圖
  • 使用正確的圖像綁定列表視圖項
  • 存儲rom位置
  • 處理鼠標單擊行並獲取rom位置
  • 用rom文件做一些事情

代碼:

    public ListForm()
    {
        InitializeComponent();

        // path to images and roms
        const string location = @"d:\temp\roms\";
        // bind image list with list view
        listViewControl.SmallImageList = imageList;
        // get all images without extension
        var images = System.IO.Directory.GetFiles(location, "*.gif").Select(f => System.IO.Path.GetFileNameWithoutExtension(f)).ToList();
        // get all roms without extension
        var zips = System.IO.Directory.GetFiles(location, "*.zip").Select(f => System.IO.Path.GetFileNameWithoutExtension(f)).ToList();
        // find all entries (images and zips) that have the same name
        var matching = images.Intersect(zips);
        var imageIndex = 0;
        // fill image list and list view at the same time and store rom location
        foreach (var match in matching)
        {
            // path to file without extension
            var file = System.IO.Path.Combine(location, match);
            // add image to image list
            imageList.Images.Add(match, Bitmap.FromFile(string.Format("{0}.gif", file)));
            // create list view item 
            var lvi = new ListViewItem(match);
            // and set list view item image
            lvi.ImageIndex = imageIndex;
            // store rom location
            lvi.Tag = string.Format("{0}.zip", file);
            imageIndex++;
            // and show
            listViewControl.Items.Add(lvi);
        }
    }

    private void listViewControl_MouseClick(object sender, MouseEventArgs e)
    {
        // when user clicks an item, fetch the rom location and go
        var item = listViewControl.GetItemAt(e.X, e.Y);
        if (item != null)
        {
            var pathToRom = item.Tag as string;
            // do something with rom ...
        }
    }

無需單獨處理圖像列表和列表視圖。 輸出如下:

在此輸入圖像描述

如果我正確理解你的問題,你可以用以下方法切換你的if語句塔:

var item = listView1.SelectedItem
string rom = "\\" + item.ToString()
// Launch code in here

並填充它,你可以改變這個:

if (listBox1.Items.Contains("game2.zip"))
{
    if (File.Exists("\\Images\\game2.jpg"))
    {
        imageList1.Images.Add(Image.FromFile("\\Images\\game2.jpg"));
        listView1.Items.Add("", 1);
    }
}

對此:

List<string> files = new List<string> { "game1.zip", "game2.zip" };

var index = 0;
foreach (var file in files)
{
    if (File.Exists("\\Images\\" + file))
    {
        imageList1.Images.Add(Image.FromFile("\\Images\\" + file.Replace(".zip", ".jpg")));
        listView1.Items.Add("", index);
        index++;
    }
}

您可以使用listView中的名稱填充圖像:

  private void PopulateListView()
  {
     foreach (string curr in listBox1.Items)
     {
        string changed = "\\Images\\" + curr.Replace(".zip", ".jpg");

        if (File.Exists(changed))
        {
           imageList1.Images.Add(Image.FromFile(changed));
           listView1.Items.Add("", 1);
        }
     }
  }

並使用MouseDoubleClick事件中的選定項目

  // launch item
  private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
  {
     string selected = (string) listBox1.SelectedItem;
     string rom = "\\" + selected;
     // Launch code in here
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM