Во-первых, вы не используете SQL
безопасный способ.
Во-вторых, вы создаете один экземпляр формы с типом переменной, скажем int
, а затем перезаписываете эту переменную каждый раз в foreach.loop.
Теперь я напишу готовый код для вас, так как этот код - полный беспорядок.
Прежде всего создайте новый class
, который будет выглядеть примерно так:
public YourNewClass
{
public int Id { get; set; }
public string razao_social { get; set; } //I am guessing this one is string in your database
public YourNewClas()
{
}
}
Теперь внутри вашей новой формы, которую вы хотите открыть (FormRecebimento
), создайте эту переменную
public List<YourNewClass> listOfMyNewClass;
И теперь вы переписываете текущий код так:
FormRecebimento abrir = new FormRecebimento();
foreach(DataGridViewRow row in dgvcontasreceber.SelectedRows)
{
using(SqlConnection conConexao1 = clsdb.AbreBanco()) //Use using since it will dispose of connection automatically after it finishes using it
{
conConexao1.Open(); // you do not have this line so maybe it is inside your function but not sure so i put it here
using(SqlCommand cmd1 = new SqlCommand("select dbo.empresas.id, dbo.empresas.razao_social from empresas inner join dbo.pessoa_empresa on dbo.pessoa_empresa.empresa_id = dbo.empresas.id inner join dbo.pessoa on dbo.pessoa.id = dbo.pessoa_empresa.pessoa_id where dbo.pessoa.id = @ID", conConexao1))
{
cmd1.Parameters.AddWithValue("@ID", lblid.Text); //Use parameters when building SqlCommand since it is safer way
SqlDataReader dr1 = cmd1.ExecuteReader();
if (dr1.HasRows == true) // I am never using this one but just if(dr1.Read()) or while(dr1.Read()) and never had problem but i left it there for you
{
if (dr1.Read())
{
//We create new object type of your custom class and add it to new forms (which we created but haven't shown yet) list
abrir.listOfMyNewClass.Add(new YourNewClass{ Id = Convert.ToInt32(dr1[0]), razao_social = dr1[1].ToString();
}
}
}
}
abrir.ShowDialog();
}
Этот код будетсоздайте свою новую форму OUTSIDE FOREACH LOOP (т.е. только один раз), которая будет иметь общедоступную переменную с именем listOfMyNewClass
, которая имеет тип List<MynewClas>
Затем INSIDE FOREACH LOOP мы заполним listOfMyNewClass
внутри новой формыAdd()
метод (поэтому мы не будем перезаписывать эту переменную каждый раз)
Затем ВНЕ FOREACH LOOP мы покажем вновь созданную форму с заполненной List<YourNewClass> listOfMyNewClass
;
Для манипулирования этой переменной внутриНовая форма просто прочитайте все о System.Collections.Generic.List здесь , и если вы хотите использовать этот список в качестве DataTable, посмотрите мой ответ здесь