PROBLEMA EXTRANHO COM LIST T

LUIS.HERRERA 07/08/2013 16:04:37
#427206
Estou preenchendo uma lista com dados de um DataGridView e mandando gravar no banco, como vários outros forms que tenho, mas nesse estou tendo um problema. Envio dois registros para gravar, mas na DAL o List tem os dois registros, mas vê ambos como o mesmo, ou seja, tem os mesmos dados.

Já chequei passo a passo a rotina, ele pega certo do Grid e adiciona certo no List, mas ao percorrer o list do DAL que recebe do list que está no form, ambos os dados são iguais, não sei o que ocorrer.

Rotinha percorre Grid e monta List<T>
            List<CargoAssociarPerguntaModelo> listPerguntasAssociar = new List<CargoAssociarPerguntaModelo>();
CargoAssociarPerguntaModelo myPergunta = new CargoAssociarPerguntaModelo();

foreach (DataGridViewRow row in gridPerguntasAssociar.Rows)
{
if (Convert.ToBoolean(row.Cells[[Ô]ASSOCIAR[Ô]].Value) == true) //coluna checkbox
{
TemItemSelecionadoGrid = true;
myPergunta.IDPergunta = (Int32)row.Cells[[Ô]IDPergunta[Ô]].Value; //aqui tem um registro 3 e posterior é 4
myPergunta.IDCargo = (Int32)cboCargoAssociar.SelectedValue;
myPergunta.IDIOMA = row.Cells[[Ô]IDIOMA[Ô]].Value.ToString();
myPergunta.ID_ATIT_HABIL = (Int32)row.Cells[[Ô]ID_ATIT_HABIL[Ô]].Value;
myPergunta.ATITUDEouHABILIDADE = Convert.ToByte(row.Cells[[Ô]ATITUDEouHABILIDADE[Ô]].Value);
listPerguntasAssociar.Add(myPergunta);
}
}


Chama Gravação
if (TemItemSelecionadoGrid == false)
{
//MessageBox.Show....
nLinhasSelecionadasGrid = 0;
return;
}
else
{
//-> Chama BLL para associar perguntas da lista listPerguntasAssociar
CargoAssociarPerguntaBLL obj = new CargoAssociarPerguntaBLL();
if (obj.Associar(listPerguntasAssociar) == true)
{
DesmarcarPerguntasGrid();
cmdIncluir.Enabled = false;
}
else
{
//MessageBox.Show....
}
}


Rotina DAL gravar
string sql = [Ô]INSERT INTO Atit_Habil_Perguntas_PorCargo (IDPergunta, IDCARGO, IDIOMA, ID_ATIT_HABIL, ATITUDEouHABILIDADE) VALUES (@IDPergunta,@IDCARGO,@IDIOMA,@ID_ATIT_HABIL,@ATITUDEouHABILIDADE);[Ô];

try
{
Dados.AbrirConexao();
SqlCommand cmd = new SqlCommand(sql, Dados.cn);
cmd.Parameters.Add([Ô]@IDPergunta[Ô], SqlDbType.Int);
cmd.Parameters.Add([Ô]@IDCARGO[Ô], SqlDbType.Int);
cmd.Parameters.Add([Ô]@IDIOMA[Ô], SqlDbType.NChar);
cmd.Parameters.Add([Ô]@ID_ATIT_HABIL[Ô], SqlDbType.Int);
cmd.Parameters.Add([Ô]@ATITUDEouHABILIDADE[Ô], SqlDbType.TinyInt);

[txt-color=#e80000]//Aqui aparece o problema, OS 2 Registros tem IDPergunta iguais (4) sendo o correto registro1 = 3 e o registro2 = 4 [/txt-color]
foreach (CargoAssociarPerguntaModelo myPerguntaAchada in listPerguntas)
{
cmd.Parameters[[Ô]@IDPergunta[Ô]].Value = myPerguntaAchada.IDPergunta; // Valores ficam iguais ???
cmd.Parameters[[Ô]@IDCARGO[Ô]].Value = myPerguntaAchada.IDCargo;
cmd.Parameters[[Ô]@IDIOMA[Ô]].Value = myPerguntaAchada.IDIOMA;
cmd.Parameters[[Ô]@ID_ATIT_HABIL[Ô]].Value = myPerguntaAchada.ID_ATIT_HABIL;
cmd.Parameters[[Ô]@ATITUDEouHABILIDADE[Ô]].Value = myPerguntaAchada.ATITUDEouHABILIDADE;
if (JaExistePergunta(myPerguntaAchada.IDPergunta, myPerguntaAchada.IDCargo, myPerguntaAchada.IDIOMA) == false) // aqui chamo um método para saber se o registro já existe no banco.
{
cmd.ExecuteNonQuery();
}
}
AssociacaoComSucesso = true;
}


Alguém tem ideia do que pode ser?
KERPLUNK 07/08/2013 16:20:19
#427207
Você não precisa de um loop para montar o List<T> do grid se você passou no DataSource um List<T>. Você pode simplesmente pegar os dados assim:

List<CargoAssociarPerguntaModelo> listPerguntasAssociar = (List<CargoAssociarPerguntaModelo>)gridPerguntasAssociar.DataSource;


LUIS.HERRERA 07/08/2013 16:33:10
#427208
Descobri o erro. Logo no início, onde monto o List a linha:
CargoAssociarPerguntaModelo myPergunta = new CargoAssociarPerguntaModelo();


tem que ficar dentro do Foreach e dentro do IF nele, por isso o erro. Ele não permite usar o mesmo objeto trocando os dados, tem que criar um novo para cada item.

Kerplunk não dá para fazer como disse, passando o DataSource, porque tenho que percorrer o Grid e ver qual linha foi selecionada pelo usuário, ou seja, na coluna do checkbox qual foi selecionado. Além disso o DataSource com o link passado ao DataGridView não tem a última coluna do Checkbox e também não tem o valor do IDCargo que é pego de um combobox, que o usuário informa para que Cargo irá associar as perguntas selecionadas no grid.

Mas obrigado pela [Ô]Sempre[Ô] ajuda.

Tópico encerrado , respostas não são mais permitidas