0

「歴史のページ」を作ろうとしています。ユーザーが文字列として取得した 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;
}

助言がありますか?これらすべての URL をファイルに入れ、ファイルから読み取り、テキストボックス/テーブルに書き込むとどうなりますか? それとも、データ構造を変更する必要がありますか? たとえば、辞書を探しますか?前もって感謝します。

4

3 に答える 3

2

テーブルの行を追加するときは、文字列だけでなく、実際には行を追加する必要があります。

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

また、ブレークポイントを追加し、リストを変換する前にリストが空でないことを確認し、後でテーブルが正しく設定されていることを確認してください。


さらに、アーキテクチャの観点から、情報の列が 1 つしかない場合は、実際には a を使用すべきではなくDataTable、a でList<T>十分です。ここでa を使用している理由はありDataTableますか?

于 2013-10-30T19:19:42.220 に答える
1

あなたの問題は、空を作成し、(空Form1である)をメソッドにprivate void History_Load(object sender, EventArgs e)渡すことです。したがって、空のグリッドがあります。解決策は、初期化を変更するか、明示的に何らかのメソッドを呼び出して実際のリストをロードする必要があることです。次のようになります。listHConvertListToDataTable(list)HistoryLoadData

解決策 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 に答える