Hej, jag hoppas på lite hjälp eftersonjag har kört fast och jag har inte kunnat hitta någonting via nätet. Det är flera saker som inte stämmer, men du kan börja med att splitta med newline, eftersom det är newline du använder när du sparar. Hej. Hej igen Först, någonting har gått galet med forumet, därav så blev det så många inlägg. Du har inte satt ListView:n att visas i detaljläge, är vad jag tror. Hej och tack André. Kul att det fungerade bra!Spara och ladda innehållet ifrån en listView
Jag har en listview. Headern innehåller två item(heter det så när det gäller headern?)
Sjäva listviewn kan innehålla ganska många item.
I sin enklaste form så kan det se ut så här
<info>
Akord ifrån F Akord till C
F C
A# F
C7 G7
</info>
Jag har försökt att "snickra lite"
<b>För att spara</b>
<code>
int filInt = Filnamn.LastIndexOf("\\") + 1;
Filnamn = Filnamn.Substring(filInt).Replace(".rtf", "");
string path = Application.StartupPath + @"\Sparade_filer\Lv_" + Filnamn + ".txt";
StringBuilder listViewContent = new StringBuilder();
foreach (ColumnHeader column in this.listView1.Columns)
{
listViewContent.Append(column.Text);
listViewContent.Append(Environment.NewLine);
}
listViewContent.Append(Environment.NewLine);
foreach (ListViewItem item in this.listView1.Items)
{
listViewContent.Append(item.Text);
listViewContent.Append(Environment.NewLine);
}
StreamWriter tw = new StreamWriter(path);
tw.WriteLine(listViewContent.ToString());
tw.Close();
</code
Denna koden gör det mästa, men jag får inte med C F G7
<b>För att oppna till listViewn</b>
<code>
int filInt = Filnamn.LastIndexOf("\\") + 1;
Filnamn = Filnamn.Substring(filInt).Replace(".rtf", "");
string path = Application.StartupPath + @"\Sparade_filer\Lv_" + Filnamn + ".txt";
char[] delimiterChars = { ' ' };//detta blir inte bra då allt är på ny rad
StreamReader streamReader = new StreamReader(path);
string text = streamReader.ReadToEnd();
String[] sText = text.Split(delimiterChars);
for (int i = 0; i < sText.Count(); i++)
{
if (sText[i] == "Akord *")
{
listView1.Columns.Add(sText[i]);
}
else
{
listView1.Items.Add(sText[i]);
}
}
streamReader.Close();
</code>
Här stämmer ingenting. Jag får ingen header och resten lägger sig fel.
Jag tror personligen att det hadde varit bättre med en xml-fil men jag kan inte det, och jag hittar
ingenting som liknar det som jag vill ha.Sv: Spara och ladda innehållet ifrån en listView
string[] sText = text.Split(Environment.NewLine.ToCharArray());
Sen måste du fundera på hur filen egentligen ska se ut, för att man på ett enkelt sätt ska kunna läsa in den igen.
Sv:Spara och ladda innehållet ifrån en listView
Först, jag har nu lyckats med att spara innehållet på dt sättet som jag ville:
<code>
int filInt = Filnamn.LastIndexOf("\\") + 1;
Filnamn = Filnamn.Substring(filInt).Replace(".rtf", "");
string path = Application.StartupPath + @"\Sparade_filer\Lv_" + Filnamn + ".txt";
StreamWriter tw = new StreamWriter(path);
tw.WriteLine(listView1.Columns[0].Text + "\t" + listView1.Columns[1].Text);
for (int i = 0; i < this.listView1.Items.Count; i++)
{
tw.WriteLine(listView1.Items[i].SubItems[0].Text + "\t" + listView1.Items[i].SubItems[1].Text);
}
tw.Flush();
tw.Close();
</code>
Från min synvinkel så ser den helt perfekt ut.
Sen är det som du säger ladda listViewn igen...
Jag hittade faktiskt en sak.
<code>
StreamReader m_streamReader = new StreamReader(path);
m_streamReader.BaseStream.Seek(0, SeekOrigin.Begin);
string strLine = m_streamReader.ReadLine();
int nStart = 0;
int count = 0;
while (strLine != null)
{
int nPos1 = strLine.IndexOf("\t", nStart);
string str1 = strLine.Substring(0, nPos1); // get first column string
nStart = nPos1 + 1;
int nPos2 = strLine.IndexOf("\t", nStart);
string str2 = strLine.Substring(nStart, nPos2 - nStart); // get second column string
nStart = nPos2 + 1;
listView1.InsertItem(count, str1, 0, new string[] { str2}); // Add the row to the ListView
count++; // increment row
nStart = 0; // reset
strLine = m_streamReader.ReadLine(); // get next line from the stream
}
</code>
.. men det lyckas inte, listViewn har ju inte listView1.InsertItem, och jag kan inte hitta någonting som
ersätter den.
Vad tror du?Sv: Spara och ladda innehållet ifrån en listView
Jag har skrivit ett helt exempel på hur jag hade löst det (testat och fungerar):
private void Save()
{
string headers = "";
string items = "";
foreach (ColumnHeader c in listView1.Columns)
headers += c.Text + '\t';
headers = headers.TrimEnd('\t');
headers += "\r\n";
foreach (ListViewItem lvi in listView1.Items)
{
for (int i = 0; i < lvi.SubItems.Count; i++)
items += lvi.SubItems[i].Text + '\t';
items = items.TrimEnd('\t');
items += "\r\n";
}
File.WriteAllText(@"C:\test\save.txt", headers + items, Encoding.UTF8);
}
private void Load()
{
string[] filerows = File.ReadAllLines(@"C:\test\save.txt");
string[] headers = filerows[0].Split('\t');
foreach (string header in headers)
listView1.Columns.Add(header);
for (int i = 1; i < filerows.Length; i++)
{
string[] items = filerows[i].Split('\t');
listView1.Items.Add(new ListViewItem(items));
}
}
På detta sätt sparas allt så att det även ser snyggt ut i filen, typ så här:
<code>
Akord ifrån F Akord till C
F C
A# F
C7 G7
</code>
Sv:Spara och ladda innehållet ifrån en listView
Sen, tack för att du försöker men jag har fått problem med öppna:
<code>
int filInt = Filnamn.LastIndexOf("\\") + 1;
Filnamn = Filnamn.Substring(filInt).Replace(".rtf", "");
string path = Application.StartupPath + @"\Sparade_filer\Lv_" + Filnamn + ".txt";
string[] filerows = File.ReadAllLines(path);
string[] headers = filerows[0].Split('\t');
foreach (string header in headers)
listView1.Columns.Add(header);
for (int i = 1; i < filerows.Length; i++)
{
string[] items = filerows[i].Split('\t');
listView1.Items.Add(new ListViewItem(items));
}
</code>
Problemen är:
Jag får inga headers. Med Messagebox så ser jag dem men de vill inte läggas till.
Jag får bara upp F A# C7 i en rad.
Vad tror du?Sv: Spara och ladda innehållet ifrån en listView
Fixa i designern eller med kod: listView1.View = View.Details.Sv:Spara och ladda innehållet ifrån en listView
Jag ändrade lite:
<code>
listView1.Columns.Add(header, 76, HorizontalAlignment.Left);
</code>
..och nu blev det helt perfekt.Sv: Spara och ladda innehållet ifrån en listView
Jag förkortade exemplet lite till ovan. Räcker med en rad för att spara filen till disk.