Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C从数据表中选择数据库的第一行数据?_C#_Database_Visual Studio - Fatal编程技术网

C# 如何使用C从数据表中选择数据库的第一行数据?

C# 如何使用C从数据表中选择数据库的第一行数据?,c#,database,visual-studio,C#,Database,Visual Studio,如何选择datatable中的第一行数据?并在labelbox上显示内容,以及单选按钮 OleDbDataAdapter dAdap = new OleDbDataAdapter(command); DataTable dTable = new DataTable(); dAdap.Fill(dTable); foreach(DataRow row in dTable.Rows) { question = row["QUESTION"].ToString(); c1 = row[

如何选择datatable中的第一行数据?并在labelbox上显示内容,以及单选按钮

OleDbDataAdapter dAdap = new OleDbDataAdapter(command);
DataTable dTable = new DataTable();
dAdap.Fill(dTable);
foreach(DataRow row in dTable.Rows)
{
    question = row["QUESTION"].ToString();
    c1 = row["C1"].ToString();
    c2 = row["C2"].ToString();
    c3 = row["C3"].ToString();
    c4 = row["C4"].ToString();
    ans = row["ANSWER"].ToString(); 
}
lblQuest.Text = question;
btnA.Text = c1;
btnB.Text = c2;
btnC.Text = c3;
btnD.Text = c4;
我尝试了这段代码,但它只显示最后一行。当我尝试重新运行查询时也是如此。它没有刷新/替换/覆盖值,只显示第一个查询的最后一行

编辑:


是的,因为变量在每次迭代时都会被覆盖,如果您只想选择第一行值,那么最后一次迭代的值将被覆盖使用dTable[0][ColumnIndex]

要在按钮上加载下一行,请单击“执行”:

int currentRow = 0;
DataTable myDt;

private void LoadNextRow()
{
    currentRow++;
    myLabel.Text = myDt[currentRow]["MyColumn"].ToString();
}

private void OnButtonClick(....)
{
    LoadNextRow();
}

您的问题是每个循环都会覆盖您的变量。循环遍历整个数据表后,以最后一行结束,并仅显示该行

要获得所需的功能,需要将DataTable存储为属性而不是局部变量

其中一种方法是跟踪当前正在查看的行。然后,单击“下一步”按钮时,只需输入当前数字并重新分配值

class YourClass
{
    private DataTable dt { get; set; }
    private int CurrentRow { get; set; }

    private void SomeMethod()
    {
        OleDbDataAdapter dAdap = new OleDbDataAdapter(command);
        dt = new DataTable();
        dAdap.Fill(dt);
        CurrentRow = 0;
        AssignToRow();
    }

    private void AssignToRow()
    {
        var row = dt.Rows[CurrentRow];
        lblQuest.Text = row["QUESTION"].ToString();
        btnA.Text = row["C1"].ToString();
        btnB.Text = row["C2"].ToString();
        btnC.Text = row["C3"].ToString();
        btnD.Text = row["C4"].ToString();
    }

    private void NextButton_Click(object sender, EventArgs e)
    {
        CurrentRow++;
        AssignToRow();
    }
}

因为在每次迭代中,您都会覆盖变量中的前一个值。您是否真正理解该代码的作用?我认为这将是解决问题的关键……对不起,你能建议如何改进它吗?更改foreach语句还是更改为另一个循环@费尔多,你能纠正我吗。在foreach中,im将表中的内容分配给相应的变量。然后我迷路了。对不起,没错。但正如前面所说的,在每次迭代中都会覆盖。因此,要获得第一行,根本不使用循环。如果您想在注释中使用“下一步”按钮,您可能会将DT另存为类字段,并使用某种绑定。@Fildor我尝试过使用它。我编辑了我的帖子。感谢您指出不要使用循环。我将研究并改进代码。到现在为止,代码将是我的基线。实际上,我只想从第一行开始。然后当我点击下一步。它将显示第二个,依此类推。所以您有按钮“下一步”,当您按下它时,它需要从下一行加载新值?是的。但是我不能为这个按钮构造语法,因为我一直在做这个。虽然这可能对这个简单的例子有效,但OP最好还是读懂数据绑定…数据表的好文档,就是这样
class YourClass
{
    private DataTable dt { get; set; }
    private int CurrentRow { get; set; }

    private void SomeMethod()
    {
        OleDbDataAdapter dAdap = new OleDbDataAdapter(command);
        dt = new DataTable();
        dAdap.Fill(dt);
        CurrentRow = 0;
        AssignToRow();
    }

    private void AssignToRow()
    {
        var row = dt.Rows[CurrentRow];
        lblQuest.Text = row["QUESTION"].ToString();
        btnA.Text = row["C1"].ToString();
        btnB.Text = row["C2"].ToString();
        btnC.Text = row["C3"].ToString();
        btnD.Text = row["C4"].ToString();
    }

    private void NextButton_Click(object sender, EventArgs e)
    {
        CurrentRow++;
        AssignToRow();
    }
}