运行一个简单的循环以显示和保存一次

以色列

活跃的成员
已加入
2020年1月10日
留言内容
26
编程经验
Beginner
你好

我有一张桌子和两个工具:

“ TblCompany”

“ txtAccountNumber”

“ btnRun”


我的桌子看起来像这样:



ID | 帐户 | 名称

1 5.6卖出

2 3.5拜因

3 1.4手机



我写了一些代码,这些代码构成了普通且简单的过滤器。目标过滤器是“帐户”列之一。

那我为什么要解决呢?我将每个ID号放入代码中,然后复制/粘贴相同的代码块以过滤下一个ID号以进行操作。但有个问题?这张桌子每天都在长大,加工时变得有点杂乱。然后,如何做单向循环,直到表的最新记录一个接一个地显示下一个帐号的最新记录,以此类推。

请查看我的代码:

C#:
//Filtering 帐户ing Number: 5.6

string connectionString = "Data Source = (LocalDB)\\MSSQLLocalDB; AttachDbFilename=C:\\Flex\\Accounting.mdf;Integrated Security = True";
                SqlConnection conn = new SqlConnection(connectionString);
                conn.Open();
   string commandString = "select top 1 * from tblTest1 where ID  ='" + “5.6” + "' order by ID   DESC";
                SqlCommand sqlCmd = new SqlCommand(commandString, conn);
                SqlDataReader read = sqlCmd.ExecuteReader();

                if (read.HasRows)
                {
                    while (read.Read())
                    {
                        txtAccount.Text = read["Account"].ToString();
                        txtName.Text = read["Name"].ToString();
                    }
                }
                else
                {
                }
                read.Close();
                conn.Close();


conn = new SqlConnection"Data Source = (LocalDB)\\MSSQLLocalDB; AttachDbFilename=C:\\Flex\\Accounting.mdf;Integrated Security = True";);
            if (conn.State != ConnectionState.Open)
                conn.Open();

            SqlCommand comm = new SqlCommand();
            comm.Connection = conn;

            SqlParameter account = new SqlParameter("@account", SqlDbType.Varchar);
            SqlParameter name = new SqlParameter("@name", SqlDbType.Varchar);

            comm.Parameters.Add(account);
            comm.Parameters.Add(name);

            account.Value = txtAccount.Text;
            name.Value = txtName.Text;

            comm.Connection = conn;

            comm.CommandText = "insert into tblTest2 ([account],[name])values(@account,@name)";

            {
               
                {
                    try
                    {
                        comm.ExecuteNonQuery();
                    }

                    finally
                    {
                        conn.Close();
                    }

//Filtering 帐户 number: 3.5

string connectionString = "Data Source = (LocalDB)\\MSSQLLocalDB; AttachDbFilename=C:\\Flex\\Accounting.mdf;Integrated Security = True";
                SqlConnection conn = new SqlConnection(connectionString);
                conn.Open();
   string commandString = "select top 1 * from tblTest1 where ID  ='" + “3.5” + "' order by ID   DESC";
                SqlCommand sqlCmd = new SqlCommand(commandString, conn);
                SqlDataReader read = sqlCmd.ExecuteReader();

                if (read.HasRows)
                {
                    while (read.Read())
                    {
                        txtAccount.Text = read["Account"].ToString();
                        txtName.Text = read["Name"].ToString();
                    }
                }
                else
                {
                }
                read.Close();
                conn.Close();


conn = new SqlConnection"Data Source = (LocalDB)\\MSSQLLocalDB; AttachDbFilename=C:\\Flex\\Accounting.mdf;Integrated Security = True";);
            if (conn.State != ConnectionState.Open)
                conn.Open();

            SqlCommand comm = new SqlCommand();
            comm.Connection = conn;

            SqlParameter account = new SqlParameter("@account", SqlDbType.Varchar);
            SqlParameter name = new SqlParameter("@name", SqlDbType.Varchar);

            comm.Parameters.Add(account);
            comm.Parameters.Add(name);

            account.Value = txtAccount.Text;
            name.Value = txtName.Text;

            comm.Connection = conn;

            comm.CommandText = "insert into tblTest2 ([account],[name])values(@account,@name)";

            {
               
                {
                    try
                    {
                        comm.ExecuteNonQuery();
                    }

                    finally
                    {
                        conn.Close();
                    }
//Filtering 1.4

string connectionString = "Data Source = (LocalDB)\\MSSQLLocalDB; AttachDbFilename=C:\\Flex\\Accounting.mdf;Integrated Security = True";
                SqlConnection conn = new SqlConnection(connectionString);
                conn.Open();
   string commandString = "select top 1 * from tblTest1 where ID  ='" + “1.4” + "' order by ID   DESC";
                SqlCommand sqlCmd = new SqlCommand(commandString, conn);
                SqlDataReader read = sqlCmd.ExecuteReader();

                if (read.HasRows)
                {
                    while (read.Read())
                    {
                        txtAccount.Text = read["Account"].ToString();
                        txtName.Text = read["Name"].ToString();
                    }
                }
                else
                {
                }
                read.Close();
                conn.Close();



conn = new SqlConnection"Data Source = (LocalDB)\\MSSQLLocalDB; AttachDbFilename=C:\\Flex\\Accounting.mdf;Integrated Security = True";);
            if (conn.State != ConnectionState.Open)
                conn.Open();

            SqlCommand comm = new SqlCommand();
            comm.Connection = conn;

            SqlParameter account = new SqlParameter("@account", SqlDbType.Varchar);
            SqlParameter name = new SqlParameter("@name", SqlDbType.Varchar);

            comm.Parameters.Add(account);
            comm.Parameters.Add(name);

            account.Value = txtAccount.Text;
            name.Value = txtName.Text;

            comm.Connection = conn;

            comm.CommandText = "insert into tblTest2 ([account],[name])values(@account,@name)";

            {
               
                {
                    try
                    {
                        comm.ExecuteNonQuery();
                    }

                    finally
                    {
                        conn.Close();
                    }
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
Why are you hard coding the ID s into your code? Doing a SELECT ID FROM tlbTest1 will give you all the ID s. With that you can do just call a helper method passing in the ID .

但是随后出现了一个问题:为什么要从tblTest1中提取帐号和帐户名,将其放入两个文本框,然后转而将帐号和名称插入tblTest2?为什么不直接插入从tlbTest1获得的tlbTest2值呢?就像是
SQL:
INSERT INTO tlbTest2([account], [name])
SELECT [account], [name]
FROM tlbTest1
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
这个线程几乎就像几个月前的其他线程一样:
 

以色列

活跃的成员
已加入
2020年1月10日
留言内容
26
编程经验
Beginner
这个线程几乎就像几个月前的其他线程一样:
是的,确实看起来像几个月前的其他主题。这是我的!我确实尝试以另一种方式解决它。但是没有解决办法。这就是为什么我要发布另一个我仍在奋斗直到现在的问题的原因。
 
Last edited:

以色列

活跃的成员
已加入
2020年1月10日
留言内容
26
编程经验
Beginner
Why are you hard coding the ID s into your code? Doing a SELECT ID FROM tlbTest1 will give you all the ID s. With that you can do just call a helper method passing in the ID .

但是随后出现了一个问题:为什么要从tblTest1中提取帐号和帐户名,将其放入两个文本框,然后转而将帐号和名称插入tblTest2?为什么不直接插入从tlbTest1获得的tlbTest2值呢?就像是
SQL:
INSERT INTO tlbTest2([account], [name])
SELECT [account], [name]
FROM tlbTest1

这是一个好问题。但是我的问题是我需要使用两个分开的表(1和2)。第一个显示从第一个到最后一个一个接一个地记录。同时显示每个并将每个数据保存到表2。这就是为什么您从table1中看到两个文本框的原因。这个解决方案非常重要。我需要学习或知道如何解决它。对我来说这是资本。谢谢!
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
从表1复制到表2的每个记录的显示是否重要?还是在处理结束时,显示屏显示最后处理的记录?

I ask because as your code in post #1 currently stands, all the user will ever see is the last record despite the fact that you've updated the textboxes to several different values. The reason for this is because if all that code above is executed the Windows message pump never get a chance to repaint the windows until your code is done running. (And please whatever you do, don't do the VB6 hack of calling DoEvents(). You open yourself up to hard to reproduce, hard to debug re-entrancy problems if you do.)
 

以色列

活跃的成员
已加入
2020年1月10日
留言内容
26
编程经验
Beginner
我写的是在这里。即使是一个很大的混乱,它的工作也是循环的(从第一个datagrid的行开始,直到最新的行)。只是为了让我们了解我需要做什么。
我有两个按钮(1和2)。
C#:
//Into the Button1:
private void button1_Click(object sender, EventArgs e)
        {      
            if (dgvDiario.Rows.Count >= 0)
            {
                int i = dgvDiario.CurrentRow.Index + 0;
                if (i >= -1 && i < dgvDiario.Rows.Count)
                    dgvDiario.CurrentCell = dgvDiario.Rows[i].Cells[0];

                DataGridViewRow row = this.dgvDiario.Rows[this.dgvDiario.SelectedCells[0].RowIndex + 1];
                if (row != null)
                {
                    txtDebit.Text = row.Cells["debit"].Value.ToString();
                    txtCredit.Text = row.Cells["credit"].Value.ToString();

                    if (dgvDiario.Rows.Count >= 0)
                    {
                        int i1 = dgvDiario.CurrentRow.Index + 0;
                        if (i1 >= -1 && i1 < dgvDiario.Rows.Count)
                            dgvDiario.CurrentCell = dgvDiario.Rows[i1].Cells[0];
                    }

                    if (dgvDiario.Rows.Count >= 1)
                    {
                        int i2 = dgvDiario.CurrentRow.Index + 1;
                        if (i2 >= -1 && i2 < dgvDiario.Rows.Count)
                            dgvDiario.CurrentCell = dgvDiario.Rows[i2].Cells[0];
                       
                        button2.PerformClick(); //Before to pass to the next row its save then so one.

                        if (dgvDiario.Rows.Count >= 0)
                        {
                            int i3 = dgvDiario.CurrentRow.Index + 0;
                            if (i3 >= -1 && i3 < dgvDiario.Rows.Count)
                                dgvDiario.CurrentCell = dgvDiario.Rows[i3].Cells[0];

                            DataGridViewRow row1 = this.dgvDiario.Rows[this.dgvDiario.SelectedCells[0].RowIndex + 1];
                            if (row1 != null)
                            {
                                txtDebit.Text = row1.Cells["debit"].Value.ToString();
                                txtCredit.Text = row1.Cells["credit"].Value.ToString();
                                if (dgvDiario.Rows.Count >= 0)
                                {
                                    int i4 = dgvDiario.CurrentRow.Index + 0;
                                    if (i4 >= -1 && i4 < dgvDiario.Rows.Count)
                                        dgvDiario.CurrentCell = dgvDiario.Rows[i4].Cells[0];
                                }

                                if (dgvDiario.Rows.Count >= 1)
                                {
                                    int i5 = dgvDiario.CurrentRow.Index + 1;
                                    if (i5 >= -1 && i5 < dgvDiario.Rows.Count)
                                        dgvDiario.CurrentCell = dgvDiario.Rows[i5].Cells[0];
                                }
                            }
                           
        //Into the Button2:                              
                           
        private void button2_Click(object sender, EventArgs e)
        {
            conn = new SqlConnection("Data Source = (LocalDB)\\MSSQLLocalDB; AttachDbFilename=C:\\Flexit_GovFAA\\Forcas_Armadas_Angolanas\\App_Datas\\FlexAccounting.mdf;Integrated Security = True");
            comm = new SqlCommand();
            if (conn.State != ConnectionState.Open)
                conn.Open();

            SqlCommand comm1 = new SqlCommand();
            comm1.Connection = conn;

            SqlParameter debit = new SqlParameter("@debit", SqlDbType.VarChar);
            comm1.Parameters.Add(debit);
            debit.Value = txtDebit.Text;
            comm1.Connection = conn;
            comm1.CommandText = "insert into testRazao ([debit])values(@debit)";

            {
                //if (MessageBox.Show("Tens certeza de guardar os dados?", "Janela de gravação", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    try
                    {
                        comm1.ExecuteNonQuery();
                    }

                    finally
                    {
                        //dgvDiario.CurrentCell = dgvDiario.Rows[dgvDiario.Rows.Count - 1].Cells[0];
                        conn.Close();
                        button1.PerformClick();
                    }

//不幸的是,在完成所有工作之后,它给出了以下错误信息:
//txtDebit.Text = row.Cells["debit"].Value.ToString();

//错误信息:
//附加信息:
//未为一个对象实例定义参考对象
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
But all you are doing in button1 is manually setting each row as the current row, updating the textboxes, and manually invoking the click event on button2. Then in button2 you are saving the current row. WTF!?!?!?!

如果需要保存数据网格的所有行,只需将这些行保存到数据库。为什么将UI用作数据模型的一部分?
 

以色列

活跃的成员
已加入
2020年1月10日
留言内容
26
编程经验
Beginner
But all you are doing in button1 is manually setting each row as the current row, updating the textboxes, and manually invoking the click event on button2. Then in button2 you are saving the current row. WTF!?!?!?!

如果需要保存数据网格的所有行,只需将这些行保存到数据库。为什么将UI用作数据模型的一部分?

好的谢谢你。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
我们不仅尝试纠正您的代码,还尝试纠正其他线程中的整个方法。您只是拒绝它,而是继续您当前的方法。我们陷入僵局。
 

以色列

活跃的成员
已加入
2020年1月10日
留言内容
26
编程经验
Beginner
精细。但是也许我自己会解释错。

我写的是在这里。即使是一个很大的混乱,它的工作也是循环的(从第一个datagrid的行开始,直到最新的行)。只是为了让我们了解我需要做什么。即使这样,也应该在专业上正确。

使用两个分开的表(1和2)。第一个显示从第一个到最后一个一个接一个地记录。同时显示每个并将每个数据保存到表2。

对不起没有道理。只是尝试了解我真正需要做什么:
C#:
private void button1_Click(object sender, EventArgs e) 
{ 
if (dgvDiario.Rows.Count >= 0) 
{ 
int i = dgvDiario.CurrentRow.Index + 0; 
if (i >= -1 && i < dgvDiario.Rows.Count) 
dgvDiario.CurrentCell = dgvDiario.Rows[i].Cells[0]; 
DataGridViewRow row = this.dgvDiario.Rows[this.dgvDiario.SelectedCells[0].RowIndex + 1]; 
if (row != null) 
{ 
txtDebit.Text = row.Cells["debit"].Value.ToString(); 
txtCredit.Text = row.Cells["credit"].Value.ToString(); 
if (dgvDiario.Rows.Count >= 0) 
{ 
int i1 = dgvDiario.CurrentRow.Index + 0; 
if (i1 >= -1 && i1 < dgvDiario.Rows.Count) 
dgvDiario.CurrentCell = dgvDiario.Rows[i1].Cells[0]; 
} 
if (dgvDiario.Rows.Count >= 1) 
{ 
int i2 = dgvDiario.CurrentRow.Index + 1; 
if (i2 >= -1 && i2 < dgvDiario.Rows.Count) 
dgvDiario.CurrentCell = dgvDiario.Rows[i2].Cells[0]; 
button2.PerformClick(); //Before to pass to the next row its save then so one. 
if (dgvDiario.Rows.Count >= 0) 
{ 
int i3 = dgvDiario.CurrentRow.Index + 0; 
if (i3 >= -1 && i3 < dgvDiario.Rows.Count) 
dgvDiario.CurrentCell = dgvDiario.Rows[i3].Cells[0]; 
DataGridViewRow row1 = this.dgvDiario.Rows[this.dgvDiario.SelectedCells[0].RowIndex + 1]; 
if (row1 != null) 
{ 
txtDebit.Text = row1.Cells["debit"].Value.ToString(); 
txtCredit.Text = row1.Cells["credit"].Value.ToString(); 
if (dgvDiario.Rows.Count >= 0) 
{ 
int i4 = dgvDiario.CurrentRow.Index + 0; 
if (i4 >= -1 && i4 < dgvDiario.Rows.Count) 
dgvDiario.CurrentCell = dgvDiario.Rows[i4].Cells[0]; 
} 
if (dgvDiario.Rows.Count >= 1) 
{ 
int i5 = dgvDiario.CurrentRow.Index + 1; 
if (i5 >= -1 && i5 < dgvDiario.Rows.Count) 
dgvDiario.CurrentCell = dgvDiario.Rows[i5].Cells[0]; 
} 
} 
//Into the Button2: 
private void button2_Click(object sender, EventArgs e) 
{ 
conn = new SqlConnection("Data Source = (LocalDB)\\MSSQLLocalDB; AttachDbFilename=C:\\Flexit_GovFAA\\Forcas_Armadas_Angolanas\\App_Datas\\FlexAccounting.mdf;Integrated Security = True"); 
if (conn.State != ConnectionState.Open) 
conn.Open(); 
SqlCommand comm1 = new SqlCommand(); 
comm1.Connection = conn; 
SqlParameter debit = new SqlParameter("@debit", SqlDbType.VarChar); 
comm1.Parameters.Add(debit); 
debit.Value = txtDebit.Text; 
comm1.Connection = conn; 
comm1.CommandText = "insert into testRazao ([debit])values(@debit)"; 
{ 
//if (MessageBox.Show("Tens certeza de guardar os dados?", "Janela de gravação", MessageBoxButtons.YesNo) == DialogResult.Yes) 
{ 
try 
{ 
comm1.ExecuteNonQuery(); 
} 
finally 
{ 
//dgvDiario.CurrentCell = dgvDiario.Rows[dgvDiario.Rows.Count - 1].Cells[0]; 
conn.Close(); 
button1.PerformClick(); 
}
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
我再问一次。为什么每个人都需要在文本框中显示?一切都会如此迅速,以至于最后,用户在文本框中看到的唯一内容是最后保存的内容。因此,作为一种更清洁的选择,为什么不一次性保存所有内容,然后仅用最后一项更新文本框即可。
 

以色列

活跃的成员
已加入
2020年1月10日
留言内容
26
编程经验
Beginner
我再问一次。为什么每个人都需要在文本框中显示?一切都会如此迅速,以至于最后,用户在文本框中看到的唯一内容是最后保存的内容。因此,作为一种更清洁的选择,为什么不一次性保存所有内容,然后仅用最后一项更新文本框即可。

很好的问题。带着这个问题,我很高兴您现在正在努力了解我。是的,我们忘了在文本框中显示内容。那么如何正确处理其余代码?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
请参阅上面的我的第二篇文章。这是将数据复制到另一个表的正确方法。然后,您可以查询表以获取最后一行并更新UI。
 

以色列

活跃的成员
已加入
2020年1月10日
留言内容
26
编程经验
Beginner
请参阅上面的我的第二篇文章。这是将数据复制到另一个表的正确方法。然后,您可以查询表以获取最后一行并更新UI。

对不起我确实忘记了一些非常重要的事情。当我说没有必要显示到文本框中时。它应该是。你知道为什么?因为操作是:
1)开始逐条读取记录(例如,将第一条记录显示在texbox中。文本框上显示的值将在表2上过滤。如果已建立)
2)从那里开始,此值将保存在表3中
3)如果只是从table1复制到table2。它不会是我真正想要的目标。

恢复:
1)从第一个记录到最后一个记录。一张一张地拿起,并在table2上进行过滤
2)经过过滤。它建立在table2上。只需将文本框上显示的值保存到table3

请参阅我的第一篇文章。对不起,我坚持要解决这个问题。我需要使其成为可能。
许多thanx。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
在这种情况下,您可以执行以下操作:
C#:
INSERT INTO tlbTest3([account], [name])
SELECT [account], [name]
FROM
    SELECT [account], [name]
    FROM tblTest1
    JOIN tblTest2
    ON tblTest1.account = tblTest2.account
 
最佳 底部