C# 列表到数据表。数据表不';不显示任何值

C# 列表到数据表。数据表不';不显示任何值,c#,winforms,list,datatable,C#,Winforms,List,Datatable,我正在尝试制作一个“历史页面”。将用户访问过的URL作为字符串读取,并将其添加到列表中,然后将其转换为DataTable,但当我单击ShowHistory菜单选项时,我得到的只是“URL”列及其下方的一个空单元格。我想我可能也不恰当地使用了Add方法 主要表格类别: private void showHistoryToolStripMenuItem_Click(object sender, EventArgs e) { using (History history = new Histor

我正在尝试制作一个“历史页面”。将用户访问过的URL作为字符串读取,并将其添加到列表中,然后将其转换为DataTable,但当我单击ShowHistory菜单选项时,我得到的只是“URL”列及其下方的一个空单元格。我想我可能也不恰当地使用了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;
}
private void showHistoryToolStripMenuItem\u单击(对象发送方,事件参数e)
{
使用(历史记录=新历史记录())
{
ShowDialog();
nonHomepage=URLInput.Text;
if(String.IsNullOrEmpty(非主页))
{
返回;
}
其他的
{
addToList(非主页);
}
}
}
公共void addToList(字符串URLvalue)
{
添加(URLvalue);
}
公共列表getList()
{
返回列表;
}
历史表格类别:

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;
}
private void History\u加载(对象发送方,事件参数e)
{
Form1 br=新的Form1();
list=br.listH;
DataTable=ConvertListToDataTable(列表);
dataGridView1.DataSource=表;
}
静态数据表ConvertListToDataTable(列表l)
{
DataTable=新的DataTable();
//int列=0;
表.列.添加(“URL”);
foreach(l中的字符串s)
{
表.行.添加;
}
返回表;
}

有什么建议吗?如果我将所有这些URL放在文件中,然后从文件中读取并写入文本框/表格,会怎么样?或者我应该改变数据结构?例如,去查字典?提前感谢。

添加表行时,实际上需要添加行,而不仅仅是字符串

    foreach(string s in l)
    {
        var row = table.NewRow();
        row[0] = s;
        table.Rows.Add(row);
    }
    return table;
另外,添加一个断点,确保列表在转换之前不是空的,并确保表在转换之后正确填充



此外,从体系结构的角度来看,如果您只有一列信息,那么您不应该真正使用
数据表
,一个
列表
就足够了。在这里使用数据表是有原因的吗?

在添加表行时,实际上必须添加行,而不仅仅是字符串

    foreach(string s in l)
    {
        var row = table.NewRow();
        row[0] = s;
        table.Rows.Add(row);
    }
    return table;
另外,添加一个断点,确保列表在转换之前不是空的,并确保表在转换之后正确填充



此外,从体系结构的角度来看,如果您只有一列信息,那么您不应该真正使用
数据表
,一个
列表
就足够了。在这里使用数据表是有原因的吗?

在添加表行时,实际上必须添加行,而不仅仅是字符串

    foreach(string s in l)
    {
        var row = table.NewRow();
        row[0] = s;
        table.Rows.Add(row);
    }
    return table;
另外,添加一个断点,确保列表在转换之前不是空的,并确保表在转换之后正确填充



此外,从体系结构的角度来看,如果您只有一列信息,那么您不应该真正使用
数据表
,一个
列表
就足够了。在这里使用数据表是有原因的吗?

在添加表行时,实际上必须添加行,而不仅仅是字符串

    foreach(string s in l)
    {
        var row = table.NewRow();
        row[0] = s;
        table.Rows.Add(row);
    }
    return table;
另外,添加一个断点,确保列表在转换之前不是空的,并确保表在转换之后正确填充



此外,从体系结构的角度来看,如果您只有一列信息,那么您不应该真正使用
数据表
,一个
列表
就足够了。在这里使用
数据表
有什么原因吗?

SpikeX回答的替代语法:

 int i = 0;
 foreach (string s in l)
 {
      table.Rows.Add()
      tables.Rows[i].SetField("COLUMN NAME", s);
      i++
 }

我想您的表中只有一列,所以使用SetField可能有点过分。但是当您有多个列时,阅读起来就容易一些,而不必返回并检查哪个列有哪个索引。

SpikeX答案的替代语法:

 int i = 0;
 foreach (string s in l)
 {
      table.Rows.Add()
      tables.Rows[i].SetField("COLUMN NAME", s);
      i++
 }

我想您的表中只有一列,所以使用SetField可能有点过分。但是当您有多个列时,阅读起来就容易一些,而不必返回并检查哪个列有哪个索引。

SpikeX答案的替代语法:

 int i = 0;
 foreach (string s in l)
 {
      table.Rows.Add()
      tables.Rows[i].SetField("COLUMN NAME", s);
      i++
 }

我想您的表中只有一列,所以使用SetField可能有点过分。但是当您有多个列时,阅读起来就容易一些,而不必返回并检查哪个列有哪个索引。

SpikeX答案的替代语法:

 int i = 0;
 foreach (string s in l)
 {
      table.Rows.Add()
      tables.Rows[i].SetField("COLUMN NAME", s);
      i++
 }

我想您的表中只有一列,所以使用SetField可能有点过分。但是,当您有多个列时,阅读起来就容易一些,而不必返回并检查哪个列有哪个索引。

您的问题是在
私有无效历史加载(对象发送方,事件参数e)
中创建一个空
表单1
,并传入
列表(该列表为空)进入方法
ConvertListToDataTable(list)
,因此您的网格为空。解决方案是您必须更改
历史记录
初始化或显式调用某个方法
加载数据
,以加载实际列表,如下所示:

解决方案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);
    }
  }
}
公共部分类历史记录:表单{
公共历史(){
初始化组件();
}
公共表单1主表单{get;set;}
私有无效历史\u加载(对象发送方,事件参数e){
var list=MainForm==null?新列表():MainForm.listH;
DataTable=ConvertListToDataTable(列表);
dataGridView1.DataSource=表;
}
//其他代码。。。。
}
//Form1类
私有void showHistoryToolStripMenuItem\u单击(对象发送方,事件参数e){
//注意使用属性初始值设定项初始化MainForm
使用(历史记录=新历史记录{MainForm=this}){
ShowDialog();
nonHomepage=URLInput.Text;
if(String.IsNullOrEmpty(非主页)){
返回;
}否则{
addToList(非主页);
}
}
}
解决方案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);
     }
  }
}
//历史类
公共部分课程历史:表格{
//d