列出数据表。 Datatable不显示任何值

时间:2013-10-30 19:17:46

标签: c# winforms list datatable

我正在尝试创建一个“历史页面”。读取用户作为字符串的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;
}

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

3 个答案:

答案 0 :(得分:2)

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

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

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


此外,从架构的角度来看,如果您只有一列信息,那么您不应该使用DataTableList<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可能有点过分。但是当你有多个列时,它更容易阅读,而不必返回并检查哪个列具有哪个索引。