2017-10-10 14 views
0

私はこの小さなC#プロジェクトの作業に取り組んでおり、データをDataGridViewコントロールに追加する必要があります。私は前に働いていましたが、悲しいことに、私は自分のコードにいくつかの変更を加えたので、以前はどうなっていたのか覚えていません。私が覚えているのは、VisualStudioではForm.Designer.csに戻り、テストの前にいくつかのコントロールをpublic staticに変更していたので、行を追加できたということです。私はそれについてオンラインで何かを読んで、そうしないように提案したので、私は自分のコードを変更したのです。行を追加できませんC#DataGridView

public void addNASDestination(string[] info){ 
     /*string[0] = Name 
     * string[1] = Path 
     * string[2] = Username 
     * string[3] = Password - Needs to be passed to XML encrypted. Not displayed in the table at all 
     */ 
     destinationsTable.Rows.Add(info[0], "NAS", info[1], info[2], info[3]); 
     destinationsTable.Update(); 
     destinationsTable.Refresh(); 
     checkTableRowCount(); 
    } 

public void addBDRDestination(string[] info){ 
     /*string[0] = Name 
     * string[1] = Path 
     */ 
     destinationsTable.Rows.Add(info[0], "BDR", info[1]); 
     //destinationsTable.Update(); 
     //destinationsTable.Refresh(); 
     checkTableRowCount(); 
    } 

これらの方法は、一度DataGridViewに行を追加するために働いていた:とにかく前進し

は、私はメソッドを持って、メインクラスAutoCheck.csを持っています。 info配列値は、別のクラスから渡された方法からAddDialog.csと呼ば:

private void destAddButton_Click(object sender, EventArgs e) 
    { 
     ac = new AutoCheck(); 
     if(destNameTextbox.TextLength <= 0 || destNameTextbox.Text == null){ 
      MessageBox.Show("Please enter a name","Error",MessageBoxButtons.OK,MessageBoxIcon.Error); 
     }else if(destPathTextbox.TextLength <= 0 || destPathTextbox.Text == null){ 
      MessageBox.Show("Please select a path", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     }else if (!Directory.Exists(destPathTextbox.Text)){ 
      MessageBox.Show("Please select a valid path", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     }else if (isNAS()) 
     { 
      if((destUserTextbox.TextLength <= 0 || destUserTextbox.Text == null) || (destPassTextbox.TextLength <= 0 || destPassTextbox.Text == null)){ 
       MessageBox.Show("Please enter a Username and Password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      }else{ 
       //If Name and User/Pass are good, add info to temp array and pass by reference to addNASDestination 
       string[] temp = new string[] { destNameTextbox.Text, destPathTextbox.Text, destUserTextbox.Text, AutoCheck.Encrypt(destPassTextbox.Text) }; 
       ac.addNASDestination(temp); 
       this.Dispose(); 
      } 
     }else{ 
      //Assume its a BDR and add info to temp array and pass by reference to addBDRDestination 
      string[] temp = new string[] {destNameTextbox.Text,destPathTextbox.Text}; 
      ac.addBDRDestination(temp); 
      this.Dispose(); 
     } 
    } 

AddDialog名前が、入力をユーザに尋ねるダイアログを記載したように、それは、入力をつかみ、アレイ内のそれを置くです、 addBDRDestinationまたはaddNASDestinationを参照して配列を渡し、新しい行をDataGridViewに追加する必要があります。

これは私のために働いていないと私は、データがさえ、データが渡されている出力にConsole.WriteLineの使用によってaddBDRDestinationまたはaddNASDestinationにオーバー送られているかどうかを確認しようとしたと、それはそれらのメソッドを到達ですが、新しいです行が追加されていません。私は今が、やっているものと同じ程度http://csharp.net-informations.com/datagridview/csharp-datagridview-add-column.htm その:

destinationsTable.Update(); 
destinationsTable.Refresh(); 

は、私もこのチュートリアルを試してみました:

は、私は(これは私の投稿のコードに残っもある)、これを追加することにより、DataGridViewをリフレッシュしてみましたそれは私のやり方でそれを分解するのではなく、配列全体を追加します。

ここに示したように、私もDataRowを作成してみました:https://social.msdn.microsoft.com/Forums/windows/en-US/f12158b3-4510-47cb-b152-409489c3a51a/how-to-add-rows-in-datagridview-programmatically?forum=winformsdatacontrols

DataRow dr = this.dt.NewRow(); 
dr["a"] = "ax"; 
dr["b"] = "add item"; 
destinationsTable.Rows.Add(dr); 

を私はAllowUserToAddRowsを有効化および無効化を試みたが、それは影響を与えませんでした。

また、私はこの試みた:私は、これは前に私のために働いたと今ではないと私は試みることができる他に何あまりにもわからないんだけど

DataGridViewRow row = (DataGridViewRow)destinationsTable.Rows[0].Clone(); 
row.Cells[0].Value = info[0]; 
row.Cells[1].Value = "BDR"; 
row.Cells[2].Value = info[1]; 
destinationsTable.Rows.Add(row); 

を。

AddDialog.csAutoCheck.csは異なるクラス/ソースファイルですが、同じ名前空間にあります。AutoCheckです。

AddDialog.csAutoCheck.csからAutoCheck ac = new AutoCheck();を追加することで、アクセス方法を指定します。同じことがAutoCheckAddDialogの場合も同じです。

他にも行を追加できますか?または私の現在のコードで何か問題が起きているのでしょうか?どうもありがとう!

+0

列を追加しましたか? DataGridView.Columnsで表示可能です。そして、あなたの投げられた例外を追加してください。 – Bagerfahrer

+0

それはあなたが話している場合は、私はすでにデザイナーに列を追加しました。行を追加するときにそれらを再度定義する必要がない限り。例外として、私は例外を取得しないと私は手動でtry catch句を追加する場合、追加するどのような例外がわからない。 – xR34P3Rx

+0

エラーが発生していない場合は、デザインを忘れてしまいます。あなたのコードで特定の問題を調べることはできません。行を追加するまでメソッドをデバッグします。または、コードを書き直します。 – Bagerfahrer

答えて

0

私はあなたが直面している問題を確認していない:

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      dgv.Columns.Add("cell_one", "Cell 1"); 
      dgv.Columns.Add("cell_two", "Cell 2"); 
      dgv.Columns.Add("cell_three", "Cell 3"); 
      dgv.Columns.Add("cell_four", "Cell 4"); 
      dgv.Columns.Add("cell_five", "Cell 5"); 
      addNASDestination(new string[] { "1", "3", "4", "5" }); 
     } 

     public void addNASDestination(string[] info) 
     { 
      /*string[0] = Name 
      * string[1] = Path 
      * string[2] = Username 
      * string[3] = Password - Needs to be passed to XML encrypted. Not displayed in the table at all 
      */ 
      dgv.Rows.Add(info[0], "NAS", info[1], info[2], info[3]); 
      //checkTableRowCount(); 
     } 
    } 

これは、コンパイルし、期待通りに動作します。


でもこの:ここ

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      DataTable dt = new DataTable("main"); 
      dt.Columns.Add("column_one", typeof(string)); 
      dt.Columns.Add("column_two", typeof(string)); 
      dt.Columns.Add("column_three", typeof(string)); 
      dt.Columns.Add("column_four", typeof(string)); 
      dt.Columns.Add("column_five", typeof(string)); 
      dgv.DataSource = dt; 
      addAnyRow(); 
     } 

     public void addAnyRow() { 
      var dt = (DataTable)dgv.DataSource; 
      var row = dt.NewRow(); 
      row["column_one"] = "1"; 
      row["column_two"] = "2"; 
      row["column_three"] = "3"; 
      row["column_four"] = "4"; 
      row["column_five"] = "5"; 
      dt.Rows.Add(row); 
    } 
} 

私はそれらを区切り:予想通り

namespace StackOverflow___46658777 
{ 
    public static class Global 
    { 
     public static DataGridView DestinationTable; 
    } 

    public partial class Form1 : Form 
    { 
     public Form1(bool dataTableOrManual = false) 
     { 
      InitializeComponent(); 
      Global.DestinationTable = dgv; 

      if (dataTableOrManual) { 
       var dt = new DataTable("main"); 
       dt.Columns.Add("column_one", typeof(string)); 
       dt.Columns.Add("column_two", typeof(string)); 
       dt.Columns.Add("column_three", typeof(string)); 
       dt.Columns.Add("column_four", typeof(string)); 
       dt.Columns.Add("column_five", typeof(string)); 
       dgv.DataSource = dt; 
       new TAutoCheck().AddAnyRow(); 
       new TAutoCheck().AddAnyRow(); 
       new TAutoCheck().AddAnyRow(); 
      } else { 
       dgv.Columns.Add("cell_one", "Cell 1"); 
       dgv.Columns.Add("cell_two", "Cell 2"); 
       dgv.Columns.Add("cell_three", "Cell 3"); 
       dgv.Columns.Add("cell_four", "Cell 4"); 
       dgv.Columns.Add("cell_five", "Cell 5"); 
       new TAutoCheck().AddNASDestination(new string[] { "1", "3", "4", "5" }); 
      } 
     } 
    } 

    public class TDialog : Form 
    { 
     public TDialog() 
     { 
      //anyButton.Click += validateRequest; 
     } 

     void validateRequest(object sender, EventArgs args) 
     { 
      new TAutoCheck().AddNASDestination(new string[] { "your", "validated", "strings", "are", "here" }); 
     } 
    } 

    public class TAutoCheck 
    { 
     public TAutoCheck() { } 

     public void AddAnyRow() 
     { 
      var dt = (DataTable)Global.DestinationTable.DataSource; 
      var row = dt.NewRow(); 
      row["column_one"] = "1"; 
      row["column_two"] = "2"; 
      row["column_three"] = "3"; 
      row["column_four"] = "4"; 
      row["column_five"] = "5"; 
      dt.Rows.Add(row); 
     } 

     public void AddNASDestination(string[] info) 
     { 
      /*string[0] = Name 
      * string[1] = Path 
      * string[2] = Username 
      * string[3] = Password - Needs to be passed to XML encrypted. Not displayed in the table at all 
      */ 
      Global.DestinationTable.Rows.Add(info[0], "NAS", info[1], info[2], info[3]); 
      //checkTableRowCount(); 
     } 
    } 
} 

作品。あなたのクラスとDataGridViewの間のコミュニケーションがどのようになっているかについてはほとんど話していなかったので、あなたがそれらを分けているのと同じくらい近いと思います。独自のソースファイル内のクラスを分離しても、内部のクラスと関数の動作は変更されません。

+0

これを分けてください。私はそれを持っている方法は、異なるソースファイル、異なるクラスが同じ名前空間上にあるということです。もちろん、同じクラスのすべてを保つなら、それは動作しますが、それはセットアップ方法とは異なります。 – xR34P3Rx

+0

DataTableはDataGridView.DataSourceにバインドされていますか?あなたは約2つのクラスについて話していますが、DataTableをDataGridViewに定義/バインドする場所はどこですか?別のDataTableをDataGridView.DataSourceにバインドしない限り、このDataTableと同じDataTableのみを使用してください。 – Bagerfahrer

+0

ソースファイル内の独立したクラスまたはロジックは、意図的に誤解を招き、クラス間の通信を切断しない限り、機能しない理由ではありません。編集された答えを見てみましょう。それから適応しようとする。 – Bagerfahrer

関連する問題