Hej.
Niby banalny problem ale tak pokręcony, że potrzebuję pomocy. Piszę aplikację w WinForms z funkcją edycji tracklist płyt Audio-CD. Otóż chciałbym za pomocą jednego przycisku przenosić wybrany utwór/track (dalej wymieniany jako wiersz) w listView do dołu i to zawsze o jeden krok - tzn. jak zaznaczę 3-ci wiersz i kliknę buttona to przeniesie się on na 4-tą pozycję a ten z czwartej wskoczy na trzecią. Kolejne kliknięcie przycisku przeniesie tym razem 4-ty wiersz na piątą pozycję a 5-ty na czwartą, itd.
Po uruchomieniu programu i załadowaniu albumu i zaznaczaniu 3-go utowru sprawa przedstawia się następująco:
Po klknięciu przycisku ładnie on zamienia się miejscami z 4-tym (czyli na razie wszystko jest OK):
Ale gdy kliknę drugi raz przycisk aby ten sam utwór (mercury) zamienił się miejscem z 5-tym to zaczynają się dziac dziwne rzeczy:
Poniżej zamieszczam kod przenoszenia wierszy listView'a o jeden w dół:
public partial class Form1 : Form
{
public List<AlbumTracks> AlbumTracksList;
}
private void Form1_Load(object sender, EventArgs e)
{
AlbumTracksList = new List<AlbumTracks>();
}
private void MoveDownSelectedTrack()
{
AlbumTracks currentTrack = null;
AlbumTracks nextTrack = null;
int albumIndex = listBox1.SelectedIndex;
int albumId = AlbumsList[albumIndex].AlbumId;
int currentTrackListIndex = -1;
int currentTrackNumber = -1;
int currentDiscNumber = -1;
int nextTrackListIndex = -1;
int nextTrackNumber = -1;
int nextDiscNumber = -1;
int currentTrackIndex = -1;
int currentTrackId = -1;
int nextTrackId = -1;
int step = -1;
List<int> tracksIds = new List<int>();
List<int> tracksIndices = new List<int>();
List<AlbumTracks> tracks = AlbumTracksList.FindAll(track => track.AlbumId == albumId);
foreach (int selectedIndex in listView1.SelectedIndices)
{
step++;
AlbumTracks? cTrack = tracks?.Find(track => track.TrackListIndex == selectedIndex);
if (cTrack != null)
{
currentTrackId = cTrack.TrackId;
tracksIds.Add(currentTrackId);
tracksIndices.Add(selectedIndex);
}
AlbumTracks? nTrack = tracks?.Find(track => track.TrackListIndex == selectedIndex + 1);
if (nTrack != null)
{
nextTrackId = nTrack.TrackId;
}
nextTrack = tracks.Find(track => track.TrackId == nextTrackId);
if (!listView1.Items[listView1.SelectedIndices[step] - 1].Selected && listView1.Items[listView1.SelectedIndices[step]].Selected)
{
nextTrack = tracks.Find(track => track.TrackId == nextTrackId);
nextTrackListIndex = nextTrack.TrackListIndex;
nextTrackNumber = nextTrack.TrackNumber;
nextDiscNumber = nextTrack.DiscNumber;
}
currentTrack = tracks.Find(track => track.TrackId == tracksIds[step]);
currentTrackListIndex = currentTrack.TrackListIndex;
currentTrackNumber = currentTrack.TrackNumber;
currentDiscNumber = currentTrack.DiscNumber;
currentTrackIndex = AlbumTracksList.IndexOf(currentTrack);
AlbumTracksList[currentTrackIndex + 1] = currentTrack;
AlbumTracksList[currentTrackIndex + 1].TrackListIndex = currentTrackListIndex;
AlbumTracksList[currentTrackIndex + 1].TrackNumber = currentTrackNumber;
AlbumTracksList[currentTrackIndex + 1].DiscNumber = currentDiscNumber;
if (!listView1.Items[listView1.SelectedIndices[step] + 1].Selected)
{
AlbumTracksList[currentTrackIndex] = nextTrack;
AlbumTracksList[currentTrackIndex].TrackListIndex = nextTrackListIndex;
AlbumTracksList[currentTrackIndex].TrackNumber = nextTrackNumber;
AlbumTracksList[currentTrackIndex].DiscNumber = nextDiscNumber;
}
}
List<AlbumTracks> newTracks = AlbumTracksList.FindAll(track => track.AlbumId == albumId);
listView1.Items.Clear();
foreach (var track in newTracks)
{
string[] row = { track.DiscNumber.ToString(), track.TrackNumber.ToString(), track.TrackPerformer, track.TrackTitle, track.TrackComposer, (track.TrackDuration > 0 ? (track.TrackDuration >= 60 ? (Math.Floor(track.TrackDuration / 60).ToString() + "m " + Math.Round(track.TrackDuration % 60, 3).ToString("0.000") + "s") : Math.Round(track.TrackDuration % 60, 3).ToString("0.000") + "s") : "Unknown"), (track.TrackPregap > 0 ? (track.TrackPregap >= 60 ? (Math.Floor(track.TrackPregap / 60).ToString() + "m " + Math.Round(track.TrackPregap % 60, 3).ToString("0.000") + "s") : Math.Round(track.TrackPregap % 60, 3).ToString("0.000") + "s") : "None"), (track.FileExists ? track.Filename : "Error! File does not exist!"), track.DiscComment, track.DiscIdentifier };
var listViewItem = new ListViewItem(row);
listView1.Items.Add(listViewItem);
}
for (int loop = 0; loop < listView1.Items.Count; loop++)
{
foreach (int index in tracksIndices)
{
if (loop == index)
{
listView1.Items[loop + 1].Selected = true;
}
}
}
listView1.Select();
}
Poniżej podaję jak wygląda świeżo wczytany do pamięci dane jednego w/w albumu w formacie JSON do listy AlbumTracksList (każdy utwór to kolejny element w tablicy):
[
{
"TrackListIndex": 0,
"TrackId": 192,
"AlbumId": 19,
"DiscId": 19,
"CueFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.cue",
"MusicFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.flac",
"FileExists": true,
"Filename": "01 - Kitaro - Tamayura.flac",
"FileType": "WAVE",
"TrackNumber": 1,
"DiscNumber": 1,
"TrackTitle": "Introduction",
"TrackPerformer": "Kitaro",
"TrackComposer": "",
"DiscComment": "ExactAudioCopy v1.6",
"DiscIdentifier": "500F2807",
"TrackDuration": 157.46666666666667,
"TrackPregap": 0
},
{
"TrackListIndex": 1,
"TrackId": 193,
"AlbumId": 19,
"DiscId": 19,
"CueFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.cue",
"MusicFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.flac",
"FileExists": true,
"Filename": "01 - Kitaro - Tamayura.flac",
"FileType": "WAVE",
"TrackNumber": 2,
"DiscNumber": 1,
"TrackTitle": "Magma",
"TrackPerformer": "Kitaro",
"TrackComposer": "",
"DiscComment": "ExactAudioCopy v1.6",
"DiscIdentifier": "500F2807",
"TrackDuration": 550.1466666666666,
"TrackPregap": 0
},
{
"TrackListIndex": 2,
"TrackId": 194,
"AlbumId": 19,
"DiscId": 19,
"CueFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.cue",
"MusicFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.flac",
"FileExists": true,
"Filename": "01 - Kitaro - Tamayura.flac",
"FileType": "WAVE",
"TrackNumber": 3,
"DiscNumber": 1,
"TrackTitle": "Mercury",
"TrackPerformer": "Kitaro",
"TrackComposer": "",
"DiscComment": "ExactAudioCopy v1.6",
"DiscIdentifier": "500F2807",
"TrackDuration": 740.44,
"TrackPregap": 0
},
{
"TrackListIndex": 3,
"TrackId": 195,
"AlbumId": 19,
"DiscId": 19,
"CueFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.cue",
"MusicFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.flac",
"FileExists": true,
"Filename": "01 - Kitaro - Tamayura.flac",
"FileType": "WAVE",
"TrackNumber": 4,
"DiscNumber": 1,
"TrackTitle": "Sitara",
"TrackPerformer": "Kitaro",
"TrackComposer": "",
"DiscComment": "ExactAudioCopy v1.6",
"DiscIdentifier": "500F2807",
"TrackDuration": 578.32,
"TrackPregap": 0
},
{
"TrackListIndex": 4,
"TrackId": 196,
"AlbumId": 19,
"DiscId": 19,
"CueFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.cue",
"MusicFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.flac",
"FileExists": true,
"Filename": "01 - Kitaro - Tamayura.flac",
"FileType": "WAVE",
"TrackNumber": 5,
"DiscNumber": 1,
"TrackTitle": "Nageki",
"TrackPerformer": "Kitaro",
"TrackComposer": "",
"DiscComment": "ExactAudioCopy v1.6",
"DiscIdentifier": "500F2807",
"TrackDuration": 383.84,
"TrackPregap": 0
},
{
"TrackListIndex": 5,
"TrackId": 197,
"AlbumId": 19,
"DiscId": 19,
"CueFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.cue",
"MusicFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.flac",
"FileExists": true,
"Filename": "01 - Kitaro - Tamayura.flac",
"FileType": "WAVE",
"TrackNumber": 6,
"DiscNumber": 1,
"TrackTitle": "Beam Wave",
"TrackPerformer": "Kitaro",
"TrackComposer": "",
"DiscComment": "ExactAudioCopy v1.6",
"DiscIdentifier": "500F2807",
"TrackDuration": 682.0266666666666,
"TrackPregap": 0
},
{
"TrackListIndex": 6,
"TrackId": 198,
"AlbumId": 19,
"DiscId": 19,
"CueFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.cue",
"MusicFilePath": "D:\\Kitaro\\DOMO\\Kitaro - Tamayura [2013]\\01 - Kitaro - Tamayura.flac",
"FileExists": true,
"Filename": "01 - Kitaro - Tamayura.flac",
"FileType": "WAVE",
"TrackNumber": 7,
"DiscNumber": 1,
"TrackTitle": "Uranus",
"TrackPerformer": "Kitaro",
"TrackComposer": "",
"DiscComment": "ExactAudioCopy v1.6",
"DiscIdentifier": "500F2807",
"TrackDuration": 787.77333333333,
"TrackPregap": 0
}
]
Zechce ktoś pomóc? Będę wdzięczny ;) Pozdrawiam.