讓我開始說我是UWP的全新產品,最接近這種語言的是我12年前的C++!UWP 10 C#。將文本文件讀入一個List <>
我正在爲Windows Universal編寫一個應用程序,並且它將逐行閱讀不同的文本文件,拆分每行的內容(某些文件不需要拆分行),添加將數據放入列表中,然後在屏幕上顯示。我已經嘗試了很多方法來做到這一點,但我沒有正確地工作。我目前有兩種方法正在工作,但並不一致。它會顯示數據,但只是有時。當我運行應用程序(在仿真器或本地設備上)時,它可能會或可能不會顯示數據,然後如果我點擊不同的頁面並回到列表頁面,它可能會或可能不會再次顯示它..
下面的代碼。在這種情況下,我拆分文本文件的內容分爲3個字符串分割上的「 - 」
我XAML.cs文件
public sealed partial class SPList : Page
{
private List<ThreeColumnList> ThreeColumnLists;
public SPList()
{
this.InitializeComponent();
ThreeColumnLists = ThreeColumnListManager.GetList();
}
}
在我的XAML
<Page
x:Class="TrackingAssistant.SPList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TrackingAssistant"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:data="using:TrackingAssistant.Model"
mc:Ignorable="d">
<Page.Resources>
<!-- x:DataType="<Name Of Class>" -->
<DataTemplate x:Key="ThreeColumnListDataTemplate" x:DataType="data:ThreeColumnList">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Grid.Column="0" Text="{x:Bind Name}" HorizontalAlignment="Left" FontSize="16" Margin="20,20,20,20" />
<TextBlock Grid.Column="1" Text="{x:Bind Age}" HorizontalAlignment="Left" FontSize="16" Margin="20,20,20,20" />
<TextBlock Grid.Column="2" Text="{x:Bind Job}" HorizontalAlignment="Right" FontSize="16" Margin="20,20,20,20" />
</StackPanel>
</DataTemplate>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="100" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="1"
Name="ResultTextBlock"
FontSize="24"
Foreground="Red"
FontWeight="Bold"
Margin="20,20,0,0" />
<!-- ItemsSource="x:Bind <Variable from the CS(Code) Class> -->
<ListView Grid.ColumnSpan="3" ItemsSource="{x:Bind ThreeColumnLists}"
ItemTemplate="{StaticResource ThreeColumnListDataTemplate}">
</ListView>
</Grid>
</Page>
在ThreeColumnList.cs
class ThreeColumnList
{
public string Name { get; set; }
public string Age { get; set; }
public string Job { get; set; }
}
在我ThreeColumnListManager.cs
class ThreeColumnListManager
{
public static List<ThreeColumnList> GetList()
{
var threecolumnlists = new List<ThreeColumnList>();
//Add a dummy row to present something on screen
threecolumnlists.Add(new ThreeColumnList { Name = "Name1", Age = "Age1", Job = "Job1" });
//First working method
readList(threecolumnlists);
//Second Working Method
//tryAgain(threecolumnlists);
return threecolumnlists;
}
public static async void readList(List<ThreeColumnList> tcl)
{
List<ThreeColumnList> a = tcl;
string _line;
var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Lists/splist.txt"));
using (var inputStream = await file.OpenReadAsync())
using (var classicStream = inputStream.AsStreamForRead())
using (var streamReader = new StreamReader(classicStream))
{
while (streamReader.Peek() >= 0)
{
Debug.WriteLine("Line");
_line = streamReader.ReadLine();
//Debug.WriteLine(string.Format("the line is {0}", _line));
string _first = "" + _line.Split('-')[0];
string _second = "" + _line.Split('-')[1];
string _third = "" + _line.Split('-')[2];
a.Add(new ThreeColumnList { Name = _first, Age = _second, Job = _third });
}
}
}
public static async void tryAgain(List<ThreeColumnList> tcl)
{
//Loading Folder
var _folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
_folder = await _folder.GetFolderAsync("Lists");
//Get the file
var _file = await _folder.GetFileAsync("splist.txt");
// read content
IList<string> _ReadLines = await Windows.Storage.FileIO.ReadLinesAsync(_file);
int i = 0;
foreach (var _line in _ReadLines)
{
i++;
string _first = "" + _line.Split('-')[0];
string _second = "" + _line.Split('-')[1];
string _third = "" + _line.Split('-')[2];
tcl.Add(new ThreeColumnList { Name = _first, Age = _second, Job = _third });
}
Debug.WriteLine("Count is " + i);
}
}
在這種情況下與該文件被一分爲三,文本文件的樣本是這樣的
Bloggs, Joe-25-Engineer
Flynn, John-43-Assistant
Sherriff, Patsy-54-Manager
!-!-!
該行! - ! - !是一個分隔線,但它仍然會顯示! ! !在屏幕上分裂後 -
最初我試圖抓住文件的內容並將它們返回給GetList()並將內容處理到列表中,但我沒有運氣。
然後我決定嘗試將列表傳遞給抓取內容並在那裏填充List的方法。
我所做的兩個功能都是在屏幕上顯示內容,但並不一致。 ReadList()似乎更頻繁地使用tryAgain(),但它每次都不起作用。
此外,只是爲了說明,我已經嘗試過這種情況,我沒有拆分文件每一行的內容,而且我看到的問題只是有時會加載。
I was following this video to get the initial list working。一旦我得到這個工作,然後我開始從文件中讀取。
我有一種感覺,我真的很接近,但我不確定。
任何有關我要去哪裏的錯誤建議都是錯誤的?
謝謝!
可以顯示(的一部分)輸入文件? – Sybren
@sybren對不起,是的!我曾打算補充一點!我已經用示例更新了帖子。我也嘗試過這種方式,我沒有將文件中的每一行都分開,我只使用一列,並且只在有時候纔有效。該文本文件中的數據就像任何帶有新行的文本文件一樣。謝謝! – microbenny
我調試你的代碼並且工作正常。我相信你的代碼部分很好。令我擔心的是xaml部分。你如何展示你的數據?你可以添加xaml部分以及如何傳遞元素中的數據? – Stamos