我正在尝试创建一个“历史页面”。读取用户作为字符串的URL并将其添加到List并将其转换为DataTable但是当我单击show History菜单选项时,我得到的只是列“urls”和它下面的空单元格。我假设我可能也不恰当地使用Add方法。
主要表格类:
private void showHistoryToolStripMenuItem_Click(object sender, EventArgs e)
{
using (History history = new History())
{
history.ShowDialog();
nonHomepage = URLInput.Text;
if (String.IsNullOrEmpty(nonHomepage))
{
return;
}
else
{
addToList(nonHomepage);
}
}
}
public void addToList(string URLvalue)
{
listH.Add(URLvalue);
}
public List<string> getList()
{
return listH;
}
历史表格类:
private void History_Load(object sender, EventArgs e)
{
Form1 br = new Form1();
list = br.listH;
DataTable table = ConvertListToDataTable(list);
dataGridView1.DataSource = table;
}
static DataTable ConvertListToDataTable(List<string> l)
{
DataTable table = new DataTable();
//int columns = 0;
table.Columns.Add("urls");
foreach(string s in l)
{
table.Rows.Add(s);
}
return table;
}
有什么建议吗?如果我将所有这些网址放在文件中然后从文件中读取并写入文本框/表格会怎么样?或许我应该改变数据结构?比如去词典吗?提前谢谢。
答案 0 :(得分:2)
添加表格行时,实际上必须添加一行,而不仅仅是字符串。
foreach(string s in l)
{
var row = table.NewRow();
row[0] = s;
table.Rows.Add(row);
}
return table;
此外,添加断点并确保在转换之前列表不为空,并确保之后正确填充表格。
此外,从架构的角度来看,如果您只有一列信息,那么您不应该使用DataTable
,List<T>
就足够了。你有什么理由在这里使用DataTable
吗?
答案 1 :(得分:1)
您的问题是,您在Form1
中创建了一个空的private void History_Load(object sender, EventArgs e)
,并将listH
(为空)传入方法ConvertListToDataTable(list)
,因此您的网格为空。解决方案是您必须更改History
初始化或显式调用某个方法LoadData
来加载实际列表,如下所示:
解决方案1
public partial class History : Form {
public History(){
InitializeComponent();
}
public Form1 MainForm {get;set;}
private void History_Load(object sender, EventArgs e) {
var list = MainForm == null ? new List<string>() : MainForm.listH;
DataTable table = ConvertListToDataTable(list);
dataGridView1.DataSource = table;
}
//other code ....
}
//Form1 class
private void showHistoryToolStripMenuItem_Click(object sender, EventArgs e) {
//note the MainForm initialization using Property initializer
using (History history = new History {MainForm = this}) {
history.ShowDialog();
nonHomepage = URLInput.Text;
if (String.IsNullOrEmpty(nonHomepage)) {
return;
} else {
addToList(nonHomepage);
}
}
}
解决方案2
//History class
public partial class History : Form {
//define this method to call explicitly before showing your History dialog
public void LoadData(List<string> list){
DataTable table = ConvertListToDataTable(list);
dataGridView1.DataSource = table;
}
//other code ...
}
//Form1 (or Main Form) class
private void showHistoryToolStripMenuItem_Click(object sender, EventArgs e) {
using (History history = new History()) {
history.LoadData(listH);// <---- call this first to load data
history.ShowDialog();
nonHomepage = URLInput.Text;
if (String.IsNullOrEmpty(nonHomepage)) {
return;
} else {
addToList(nonHomepage);
}
}
}
答案 2 :(得分:0)
SpikeX答案的替代语法:
int i = 0;
foreach (string s in l)
{
table.Rows.Add()
tables.Rows[i].SetField("COLUMN NAME", s);
i++
}
我想你的表中只有1列,所以使用SetField可能有点过分。但是当你有多个列时,它更容易阅读,而不必返回并检查哪个列具有哪个索引。