0

実行時にフォームに textBoxes を追加しようとしています。また、これらのボックスにデータを表示したいと考えています。データはデータベースから取得されます。私のコードは機能しますが、最初の行しか表示できません。使用しているループが 1 回しか実行されない理由がわかりません。

そして、誰かが textBoxes がオーバーラップしていると判断する前に、コードを適切にチェックして、それがどのように可能であるかについて論理的な説明をしてくださいYi

私は試してみて、すでに30回のように再チェックして、テキストボックスが互いに重なっていないことを確認しました。議論のために textBoxes が互いに重なり合っていると考えたとしても、表示される te​​xtBoxes には、私の場合のようにテーブルの最初の行ではなく、最後の行のデータが含まれることに同意する必要があります。暴言を吐いて申し訳ありませんが、明らかに重複していないのに、テキストボックスが重複していると結論付ける人々にうんざりしています。以下は私のコードです。

var count=5; // dependent 

//SQL connection and data read begins
SqlCeConnection conn=new SqlCeConnection();
conn.ConnectionString=connection; //connection is a string variable which has the connection string details
conn.Open();
SqlCeCommand com=new SqlCeCommand();
com.Connection=conn;
com.CommandType=CommandType.Text;

for(int i=3; i<=count; i++) {
    com.CommandText="SELECT pname, cname, budget, advance, ddate FROM data WHERE (ID = @id)";
    com.Parameters.AddWithValue("@id", i);
    com.ExecuteNonQuery();
    SqlCeDataReader rd=com.ExecuteReader();

    while(rd.Read()) {
        pname=(rd["pname"].ToString());
        cname=(rd["cname"].ToString());
        budget=(rd["budget"].ToString());
        advance=(rd["advance"].ToString());
        ddate=(rd["ddate"].ToString());
    }

    TextBox tobj=new TextBox();
    tobj.Location=new Point(10, (40+((i-2)*20)));
    tobj.Tag=1;
    tobj.Text=pname;
    tobj.AutoSize=false;
    tobj.Width=150;
    tobj.ReadOnly=true;
    this.Controls.Add(tobj);

    TextBox tobj1=new TextBox();
    tobj1.Location=new Point(160, (40+((i-2)*20)));
    tobj1.Tag=2;
    tobj1.Text=cname;
    tobj1.AutoSize=false;
    tobj1.Width=150;
    tobj1.ReadOnly=true;
    this.Controls.Add(tobj1);

    TextBox tobj2=new TextBox();
    tobj2.Location=new Point(310, (40+((i-2)*20)));
    tobj2.Tag=3;
    tobj2.Text=budget;
    tobj2.AutoSize=false;
    tobj2.Width=100;
    tobj2.ReadOnly=true;
    this.Controls.Add(tobj2);

    TextBox tobj3=new TextBox();
    tobj3.Location=new Point(410, (40+((i-2)*20)));
    tobj3.Tag=4;
    tobj3.Text=advance;
    tobj3.AutoSize=false;
    tobj3.Width=100;
    tobj3.ReadOnly=true;
    this.Controls.Add(tobj3);

    TextBox tobj4=new TextBox();
    tobj4.Location=new Point(510, (40+((i-2)*20)));
    tobj4.Tag=5;
    tobj4.Text=ddate;
    tobj4.AutoSize=false;
    tobj4.Width=100;
    tobj4.ReadOnly=true;
    this.Controls.Add(tobj4);
}

com.Dispose();
conn.Close();
  • アップデート:

さて、ループが正しく実行されていないことを確認し、問題の原因となっているコード ブロックを特定しました。誰かがこれを克服する方法について私に提案できますか?

ループ内に存在すると、3 回実行する必要がある場合でも、1 回だけ実行するコードのブロック。

            //SQL connection and data read begins

            int count =5;
            SqlCeConnection conn = new SqlCeConnection();
            conn.ConnectionString = connecion; //connection is a string variable which has the connection string details
            conn.Open();
            SqlCeCommand com = new SqlCeCommand();
            com.Connection = conn;
            com.CommandType = CommandType.Text;

            MessageBox.Show("The value of count just before the loop is " + count.ToString());
            for (int i = 3; i <= count; i++)
            {

                com.CommandText = "SELECT pname, cname, budget, advance, ddate FROM data WHERE (ID = @id)";
                com.Parameters.AddWithValue("@id", i);
                com.ExecuteNonQuery();
                SqlCeDataReader rd = com.ExecuteReader();
                while (rd.Read())
                {
                    pname = (rd["pname"].ToString());
                    cname = (rd["cname"].ToString());
                    budget = (rd["budget"].ToString());
                    advance = (rd["advance"].ToString());
                    ddate = (rd["ddate"].ToString());
                }
            }

            com.Dispose();
            conn.Close();

SQL部分を削除すると、ループを3回実行できますが、ループ内にSQL部分があると機能しません。これを克服するために何ができるでしょうか?

4

2 に答える 2

4

あなたのループは正常に動作します。問題は、作成されたすべてのテキスト ボックスが重なっているということです。ループ内でラウンドが 終了しXたら、テキスト ボックスの位置の位置を変更します。

//Before strat loop
int xCoorCons=10;  
...
...
//inside loop    
tobj.Location = new Point(xCoorCons, (40+((i-2)*20)));  
...  
...
//at end of the loop
xCoorCons=xCoorCons+20;

編集

            try
            { 
                //your entire code
            }
            catch (Exception e) 
            { 
                MessageBox.Show(e.Message); 
            }
于 2013-01-07T05:53:55.347 に答える
1

問題は、ケンキンが指摘したように、コントロールとは何の関係もありませんでしたが、スローされた例外でした。

私は最終的にエラーを見つけて解決しました。作業コードを投稿しています。同様の問題に直面する可能性のある他の誰かを助けるのに役立つことを願っています

SqlCeConnection conn = null;
                SqlCeCommand com = null;
                try
                {
                    //SQL connection and data read begins

                    conn = new SqlCeConnection();
                    conn.ConnectionString = connecion; //connection is a string variable which has the connection string details
                    conn.Open();
                    com = new SqlCeCommand();
                    com.Connection = conn;
                    com.CommandType = CommandType.Text;
                    com.CommandText = "SELECT pname, cname, budget, advance, ddate FROM data WHERE (ID = @id)";
                    com.Parameters.Add("@ID", SqlDbType.Int);
                    com.Prepare();
                    MessageBox.Show("The value of count just before the loop is " + count.ToString());

                    for (int i = 3; i <= count; i++)
                    {
                        com.Parameters[0].Value = i;
                        using (SqlCeDataReader rd = com.ExecuteReader())
                        if (rd.Read())
                        {
                            pname = (rd["pname"].ToString());
                            cname = (rd["cname"].ToString());
                            budget = (rd["budget"].ToString());
                            advance = (rd["advance"].ToString());
                            ddate = (rd["ddate"].ToString());

                            TextBox tobj = new TextBox();
                            tobj.Location = new Point(10, (40 + ((i - 2) * 20)));
                            tobj.Tag = 1;
                            tobj.Text = pname;
                            tobj.AutoSize = false;
                            tobj.Width = 150;
                            tobj.ReadOnly = true;
                            this.Controls.Add(tobj);

                            TextBox tobj1 = new TextBox();
                            tobj1.Location = new Point(160, (40 + ((i - 2) * 20)));
                            tobj1.Tag = 2;
                            tobj1.Text = cname;
                            tobj1.AutoSize = false;
                            tobj1.Width = 150;
                            tobj1.ReadOnly = true;
                            this.Controls.Add(tobj1);

                            TextBox tobj2 = new TextBox();
                            tobj2.Location = new Point(310, (40 + ((i - 2) * 20)));
                            tobj2.Tag = 3;
                            tobj2.Text = budget;
                            tobj2.AutoSize = false;
                            tobj2.Width = 100;
                            tobj2.ReadOnly = true;
                            this.Controls.Add(tobj2);

                            TextBox tobj3 = new TextBox();
                            tobj3.Location = new Point(410, (40 + ((i - 2) * 20)));
                            tobj3.Tag = 4;
                            tobj3.Text = advance;
                            tobj3.AutoSize = false;
                            tobj3.Width = 100;
                            tobj3.ReadOnly = true;
                            this.Controls.Add(tobj3);

                            TextBox tobj4 = new TextBox();
                            tobj4.Location = new Point(510, (40 + ((i - 2) * 20)));
                            tobj4.Tag = 5;
                            tobj4.Text = ddate;
                            tobj4.AutoSize = false;
                            tobj4.Width = 100;
                            tobj4.ReadOnly = true;
                            this.Controls.Add(tobj4);

                        }
                    }



                    //SQL operation ends
                }
                finally
                {
                    if (null != com) com.Dispose();
                    if (null != conn) conn.Dispose();
                }
            }
于 2013-01-07T14:43:46.733 に答える