0

我正在尝试制作一个“历史页面”。读取用户作为字符串的 url 并将它们添加到 List 并将其转换为 DataTable 但是当我单击显示历史菜单选项时,我得到的只是列“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;
}

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

4

3 回答 3

2

添加表格行时,实际上必须添加一行,而不仅仅是一个字符串。

    foreach(string s in l)
    {
        var row = table.NewRow();
        row[0] = s;
        table.Rows.Add(row);
    }
    return table;

此外,添加断点并确保您的列表在转换之前不为空,并确保之后正确填充您的表。


此外,从架构的角度来看,如果您只有一列信息,那么您实际上不应该使用 a DataTable, aList<T>就足够了。您在这里使用 a 有什么原因DataTable吗?

于 2013-10-30T19:19:42.220 回答
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);
     }
  }
}
于 2013-10-30T21:00:39.733 回答
0

SpikeX 答案的替代语法:

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

我想您的表中只有 1 列,因此使用 SetField 可能有点过分。但是当您有多个列时,它会更容易阅读,而不必返回并检查哪个列具有哪个索引。

于 2013-10-30T19:31:10.470 回答