Передача всех предметов в другую форму - PullRequest
0 голосов
/ 13 сентября 2018

Я передаю другой форме элементы вариантов выбора в таблице данных, однако мне нужно, чтобы вторая форма открывалась только один раз. Я положил вызов формы внутри

    foreach (DataGridViewRow row in dgvcontasreceber.SelectedRows)
    {

       SqlConnection conConexao1 = clsdb.AbreBanco();
       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 ='" + lblid.Text + "'", conConexao1);
       SqlDataReader dr1 = cmd1.ExecuteReader();

        if (dr1.HasRows == true)
        {
            if (dr1.Read())
            {
               var item = new clsItens
               {
                  PessoaId = txtid.Text,
                  EmpresaId = int.Parse(dr1[0].ToString()),
                  RazaoSocial = dgvcontasreceber[0, linhaAtual].Value.ToString()
               };

               items.Add(item);
             }
         }

         dr1.Close();
         cmd1.Clone();
         conConexao1.Close();

   }
   FormRecebimento abrir = new FormRecebimento(items);
   abrir.ShowDialog();

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Во-первых, вы не используете 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, посмотрите мой ответ здесь

0 голосов
/ 14 сентября 2018

Как говорится в первом ответе, вам нужно найти способ, чтобы FormRecebimento получил коллекцию (которая может быть массивом, списком, IEnumerable и т. Д.) И использовал эти значения внутри формы в соответствии с вашими потребностями.

Может быть, вы можете черпать вдохновение из этого:

class Item
{
    public string PessoaId { get; set };
    public int EmpresaId { get; set };
    public string RazaoSocial { get; set };
}

class FormRecebimento
{
    private List<Item> items;

    public FormRecebimento(List<Item> items)
    {
        this.items = items;
        this.initialize();
    }

    private void initialize()
    {
        /* Iterate over Item list and set the values you want
        pessoaid = int.Parse(txtid.Text);
        id_empresa = int.Parse(dgvcontasreceber[16, linhaAtual].Value.ToString());
        idrec.Text = dgvcontasreceber[0, linhaAtual].Value.ToString();
        */
    }
}

//... 

List<Item> items = new List<Item>();

foreach(DataGridViewRow row in dgvcontasreceber.SelectedRows)
{

   SqlConnection conConexao1 = clsdb.AbreBanco();
   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 ='" + lblid.Text + "'", conConexao1);
   SqlDataReader dr1 = cmd1.ExecuteReader();

   if (dr1.HasRows == true)
   {
      if (dr1.Read())
      {
         var item = new Item
         { 
            PessoaId = txtid.Text, 
            EmpresaId = int.Parse(dr1[0].ToString()),
            RazaoSocial = dgvcontasreceber[0, linhaAtual].Value.ToString()
         }
         items.add(item);
      }
   }

   dr1.Close();
   cmd1.Clone();
   conConexao1.Close();
}

FormRecebimento abrir = new FormRecebimento(items);
abrir.ShowDialog();

Я не мог действительно использовать правильные «метки» в именах переменных, потому что я не очень хорошо понимал ваш код, поэтому я действительно рекомендую взглянуть на материалы «Чистого кода» в Интернете, я уверен, что это вам очень поможет :) 1006 *

Совет: http://www.macoratti.net/17/05/c_codlimp1.htm (pTBR, как я полагаю, вы также говорите на португальском)

0 голосов
/ 13 сентября 2018

В настоящее время для работы FormRecebimento требуется один pessoaid, один id_empresa и один idrec. Если вам необходимо передать несколько значений в форму, вы должны заменить эти свойства новым свойством типа IEnumberable<DataGridViewRow>. Если бы мы вызывали это новое свойство inputRows, то ваш код выглядел бы примерно так:

FormRecebimento abrir = new FormRecebimento();
abrir.inputRows = dgvcontasreceber.SelectedRows;
abrir.ShowDialog();

Способ реализации отображения inputRows выходит за рамки этого вопроса, но, по крайней мере, это должно помочь вам начать работу в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...