从表中读取多个数据并在表单中创建文本框

时间:2017-03-28 20:48:29

标签: c# mysql

我在MySQL中的表是这样的:

MySQL table

我的表单中有一个面板,我想为此表中的每个数据创建一个TextBox,并将sikicerik数据写入该TextBox的文本。 实际上我做了它,但它只创建一个TextBox并只选择表上的第一个数据。

我的代码是这样的:

int count = oku.FieldCount;

reader.Read();
{
    for (int i = 0; i < count; i++)
    {
        TextBox txt1 = new TextBox();
        Point txtyer = new Point(x, y);
        txt1.Text = reader["sikicerik"].ToString();
        txt1.Name = i.ToString();
        x = x + 25;
        y = y + 25;
        panel1.Controls.Add(txt1);
    }
}

它只创建一个TextBox并写入&#34; 5&#34;在它。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您需要了解的是,您需要在浏览每条记录后致电reader.Read()。让我们说你的结果数据集有5条记录,所以为了读取第一条记录,你需要调用reader.Read(),它会用适当的数据填充读者对象。要阅读第二条记录,您需要再次致电reader.Read()。像这样:

int count = reader.FieldCount;

for (int i = 0; i < count; i++)
{
    reader.Read();
    TextBox txt1 = new TextBox();
    Point txtyer = new Point(x, y);
    txt1.Location = txtyer;
    txt1.Text = reader["sikicerik"].ToString();
    txt1.Name = i.ToString();
    y = y + 25;
    panel1.Controls.Add(txt1);
 }

您可能无法查看所有TextBox的原因是您正在更新TextBox的x和y坐标。您可能想要做的只是增加上面的y坐标,所有TextBox都会垂直显示。您可能还希望调整表单大小,以便TextBox不会被隐藏。

另外,正如@Steve在上面的评论中提到的(我错过了),您需要分配新文本框的位置,如上面的代码所示。

答案 1 :(得分:0)

我想您从 reader 变量中获取了FieldCount。

现在,在此上下文中,您应该遍历读取并在循环内部为原始查询检索的每个字段创建文本框。

最后,如果你没有设置TextBox的Location属性,那么它们将在其他文件框的顶部创建,你只能看到最上面的一个具有在循环中获得的最新值

// Get the number of fields present in the reader....
int count = reader.FieldCount;

// Read one record at time
while(reader.Read())
{
    // Create a textbox for each field in the record
    for (int i = 0; i < count; i++)
    {
        TextBox txt1 = new TextBox();

        // Set its location on screen
        // Probably if you have many fields you need to 
        // use a better algorithm to calculate x,y position 
        txt1.Location = new Point(x, y);
        txt1.Text = reader[i].ToString();
        txt1.Name = i.ToString();
        x = x + 25;
        y = y + 25;
        panel1.Controls.Add(txt1);
    }
}

如果您只想为 sikicerik 字段创建文本框,您有两种选择。第一个是推荐的,因为它可以减少数据库的开销,包括将用于构建读取的SELECT查询更改为

 SELECT sikicerik FROM yourTableName

另一个选项是对代码的简单更改。您不需要遍历FieldCount,因为您已经知道您只对一个字段感兴趣

// Read one record at time
while(oku.Read())
{
    textBox1.Text = oku["soru"].ToString();
    label1.Text = Form2.sinavno;

    // Create the single textbox required for the only field required
    TextBox txt1 = new TextBox();

    // Set its location on screen
    txt1.Location = new Point(x, y);
    txt1.Text = oku["sikicerik"].ToString();
    txt1.Name = i.ToString();
    x = x + 25;
    y = y + 25;
    panel1.Controls.Add(txt1);

    // Repeat the loop for each record.

}