无法将字符串插入列表视图或文本框?
Can't insert string into listview or textbox?
我正在制作一个 winform 应用程序,我可以在其中输入名为 Tibia 的游戏中的玩家姓名。当我输入玩家名称时,它会转到网站 (www.tibia.com) 并搜索玩家,并为我提供有关玩家的一些数据。在这种情况下:Returns 姓名、职业和级别。为此,我使用 HtmlAgilityPack 从网站上为我获取数据。
为此我有三个字符串变量:charname、voc 和 lvl。
当我将数据放入变量中时,我可以制作消息框来打印它们。喜欢:
MessageBox.Show("Your name is: " + charname);
而且效果很好。
但我似乎无法将它们添加到我的 listView(称为:characterList)或文本框 (textBox1)。应用程序崩溃并给我这个错误:
An unhandled exception of type 'System.AggregateException' occurred in mscorlib.dll
而且我似乎无法修复它。我已经尽力了。
这是我的代码:
//Goes to the website and grabs the data from the table
static async Task<List<List<string>>> GetPlayers()
{
playername.Replace(" ", "+");
string url = "https://secure.tibia.com/community/?subtopic=characters&name=" + playername;
using (var client = new HttpClient())
{
var html = await client.GetStringAsync(url);
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
var table = doc.DocumentNode.SelectSingleNode("//table[@cellpadding='4']");
return table.Descendants("tr")
.Skip(1)
.Select(tr => tr.Descendants("td")
.Select(td => WebUtility.HtmlDecode(td.InnerText))
.ToList())
.ToList();
}
}
这是我的代码,用于遍历找到的数据,并将其添加到 ListView (characterList) 中:
private void addCharacter_Click(object sender, EventArgs e)
{
playername = Interaction.InputBox("Please enter a character name.", "Input Character Name");
if (playername.Length > 0)
{
//get the player data from the website
//name, vocation and level
//add their values to the 3 variables: charname, voc and lvl.
//and add them to the listview (characterList)
Task.Run(async () =>
{
var players = await GetPlayers();
foreach (var row in players)
{
if (row[0] == "Name:")
{
charname = row[1];
}
}
foreach (var row in players)
{
if (row[0] == "Vocation:")
{
if (row[1] == "Druid" || row[1] == "Elder Druid")
{
voc = "ED";
}
else if (row[1] == "Knight" || row[1] == "Elite Knight")
{
voc = "EK";
}
else if (row[1] == "Paladin" || row[1] == "Royal Paladin")
{
voc = "RP";
}
else if (row[1] == "Sorcerer" || row[1] == "Master Sorcerer")
{
voc = "MS";
}
else if (row[1] == "None")
{
voc = "None";
}
}
}
foreach (var row in players)
{
if (row[0] == "Level:")
{
lvl = row[1];
}
}
if (charname.Length > 0 && lvl.Length > 0 && voc.Length > 0)
{
string[] row1 = { voc, lvl };
characterList.Items.Add(charname).SubItems.AddRange(row1);
}
}).Wait();
}
else if (playername.Length < 1)
{
MessageBox.Show("Invalid character name.", "Error");
}
}
这也是该网站的插图以及它如何从表格中获取数据。
所以问题是没有获取数据。它正确地得到它,因为我可以添加消息框来打印它。但是当我尝试将它们添加到我的列表视图或任何文本框时,它就是行不通。就像我不能使用数据一样。只需将其打印在消息框中即可。我也不知道为什么。
我还尝试使用一个按钮自行将一些自定义数据添加到 listView 中,这很有效。所以我添加数据的方式应该没有问题。只是我不想直接插入文本,而是想插入变量。
看看这个例子,我用一个按钮手动添加数据:
我怀疑这一行:
characterList.Items.Add(charname).SubItems.AddRange(row1);
...正在工作线程上执行;失败,因为不允许非 STA 工作线程更新 UI;因此抛出 AggregateException
因为它在 Task
.
我很确定您的 addCharacter_Click()
中不需要 Task.Run()
,尤其是当您执行 .Wait()
时。
改为:
private async void addCharacter_Click(object sender, EventArgs e)
{
playername = Interaction.InputBox("Please enter a character name.", "Input Character Name");
if (playername.Length > 0)
{
//get the player data from the website
//name, vocation and level
//add their values to the 3 variables: charname, voc and lvl.
//and add them to the listview (characterList)
var players = await GetPlayers();
foreach (var row in players)
{
if (row[0] == "Name:")
{
charname = row[1];
}
}
.
.
.
注意上面的方法现在如何被标记为 async
。
我正在制作一个 winform 应用程序,我可以在其中输入名为 Tibia 的游戏中的玩家姓名。当我输入玩家名称时,它会转到网站 (www.tibia.com) 并搜索玩家,并为我提供有关玩家的一些数据。在这种情况下:Returns 姓名、职业和级别。为此,我使用 HtmlAgilityPack 从网站上为我获取数据。
为此我有三个字符串变量:charname、voc 和 lvl。
当我将数据放入变量中时,我可以制作消息框来打印它们。喜欢:
MessageBox.Show("Your name is: " + charname);
而且效果很好。
但我似乎无法将它们添加到我的 listView(称为:characterList)或文本框 (textBox1)。应用程序崩溃并给我这个错误:
An unhandled exception of type 'System.AggregateException' occurred in mscorlib.dll
而且我似乎无法修复它。我已经尽力了。
这是我的代码:
//Goes to the website and grabs the data from the table
static async Task<List<List<string>>> GetPlayers()
{
playername.Replace(" ", "+");
string url = "https://secure.tibia.com/community/?subtopic=characters&name=" + playername;
using (var client = new HttpClient())
{
var html = await client.GetStringAsync(url);
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
var table = doc.DocumentNode.SelectSingleNode("//table[@cellpadding='4']");
return table.Descendants("tr")
.Skip(1)
.Select(tr => tr.Descendants("td")
.Select(td => WebUtility.HtmlDecode(td.InnerText))
.ToList())
.ToList();
}
}
这是我的代码,用于遍历找到的数据,并将其添加到 ListView (characterList) 中:
private void addCharacter_Click(object sender, EventArgs e)
{
playername = Interaction.InputBox("Please enter a character name.", "Input Character Name");
if (playername.Length > 0)
{
//get the player data from the website
//name, vocation and level
//add their values to the 3 variables: charname, voc and lvl.
//and add them to the listview (characterList)
Task.Run(async () =>
{
var players = await GetPlayers();
foreach (var row in players)
{
if (row[0] == "Name:")
{
charname = row[1];
}
}
foreach (var row in players)
{
if (row[0] == "Vocation:")
{
if (row[1] == "Druid" || row[1] == "Elder Druid")
{
voc = "ED";
}
else if (row[1] == "Knight" || row[1] == "Elite Knight")
{
voc = "EK";
}
else if (row[1] == "Paladin" || row[1] == "Royal Paladin")
{
voc = "RP";
}
else if (row[1] == "Sorcerer" || row[1] == "Master Sorcerer")
{
voc = "MS";
}
else if (row[1] == "None")
{
voc = "None";
}
}
}
foreach (var row in players)
{
if (row[0] == "Level:")
{
lvl = row[1];
}
}
if (charname.Length > 0 && lvl.Length > 0 && voc.Length > 0)
{
string[] row1 = { voc, lvl };
characterList.Items.Add(charname).SubItems.AddRange(row1);
}
}).Wait();
}
else if (playername.Length < 1)
{
MessageBox.Show("Invalid character name.", "Error");
}
}
这也是该网站的插图以及它如何从表格中获取数据。
所以问题是没有获取数据。它正确地得到它,因为我可以添加消息框来打印它。但是当我尝试将它们添加到我的列表视图或任何文本框时,它就是行不通。就像我不能使用数据一样。只需将其打印在消息框中即可。我也不知道为什么。
我还尝试使用一个按钮自行将一些自定义数据添加到 listView 中,这很有效。所以我添加数据的方式应该没有问题。只是我不想直接插入文本,而是想插入变量。
看看这个例子,我用一个按钮手动添加数据:
我怀疑这一行:
characterList.Items.Add(charname).SubItems.AddRange(row1);
...正在工作线程上执行;失败,因为不允许非 STA 工作线程更新 UI;因此抛出 AggregateException
因为它在 Task
.
我很确定您的 addCharacter_Click()
中不需要 Task.Run()
,尤其是当您执行 .Wait()
时。
改为:
private async void addCharacter_Click(object sender, EventArgs e)
{
playername = Interaction.InputBox("Please enter a character name.", "Input Character Name");
if (playername.Length > 0)
{
//get the player data from the website
//name, vocation and level
//add their values to the 3 variables: charname, voc and lvl.
//and add them to the listview (characterList)
var players = await GetPlayers();
foreach (var row in players)
{
if (row[0] == "Name:")
{
charname = row[1];
}
}
.
.
.
注意上面的方法现在如何被标记为 async
。