2010-04-23 84 views
1

通过列表 ej将对象添加到datagridview(只有一种)。 datagridview中的对象

List<Material> mater = new List<Material>(); 
DataGridView dgvMAterial = new DataGridView(); 

dgvMaterial.DataSource = null; 
mater.Add((Material)cmbMaterial.SelectedValue); 
dgvMaterial.DataSource = mater; 

但每次我点击数据网格时,我都会得到一个indexoutofrangeexeption。 可以告诉我为什么? 感谢

这里是我的形式

public partial class inicio : Form 
{ 
    private string ConnectionString = "Data Source=localhost\\sqlexpress;Initial Catalog=data.mdf;Integrated Security=SSPI;"; 
    //private string ConnectionString = "Server=.\\SQLExpress;AttachDbFilename=|DataDirectory|\\data\\data_data.mdf.mdf; Database=data.mdf;Trusted_Connection=Yes;"; 
    private ISessionFactory sessionFactory; 
    List<Material> mater = new List<Material>(); 
    List<Salarios> salar = new List<Salarios>(); 
    IBindingList mind = new BindingList<Salarios>(); 
    Productos prod; 

    public inicio() 
    { 
     InitializeComponent(); 
     sessionFactory = nhn.BusinessObjects.Initialize.CreateSessionFactory(ConnectionString); 
     dgvMaterial.DataSource = mater; 
    } 

    private void materialToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Catalogos.frmMaterial material = new costeos.Catalogos.frmMaterial(ConnectionString); 
     material.ShowDialog(this); 
     material.Dispose(); 
    } 

    private void salariosToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Catalogos.frmSalarios salarios = new costeos.Catalogos.frmSalarios(ConnectionString); 
     salarios.ShowDialog(this); 
     salarios.Dispose(); 
    } 

    private void agregarToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Catalogos.frmAddRemuneraciones rem = new costeos.Catalogos.frmAddRemuneraciones(ConnectionString); 
     rem.ShowDialog(this); 
     rem.Dispose(); 
    } 

    private void agregarToolStripMenuItem1_Click(object sender, EventArgs e) 
    { 
     Catalogos.frmAddAdmin adm = new costeos.Catalogos.frmAddAdmin(ConnectionString); 
     adm.ShowDialog(this); 
     adm.Dispose(); 
    } 

    private void agregarToolStripMenuItem2_Click(object sender, EventArgs e) 
    { 
     Catalogos.frmAddInsumosInd insumos = new costeos.Catalogos.frmAddInsumosInd(ConnectionString); 
     insumos.ShowDialog(this); 
     insumos.Dispose(); 
    } 

    private void txt_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (char.IsDigit(e.KeyChar) || char.IsPunctuation(e.KeyChar) || char.IsControl(e.KeyChar)) 
     { 
      e.Handled = false; 
     } 
     else 
     { 
      e.Handled = true; 
     } 
    } 

    private void inicio_Load(object sender, EventArgs e) 
    { 
     LlenaCampos(); 
    } 

    private void LlenaCampos() 
    { 
     using (var session = sessionFactory.OpenSession()) 
     { 
      using (var transaction = session.BeginTransaction()) 
      { 
       var mat = session.CreateCriteria(typeof(Material)) 
        .List<Material>(); 
       var sal = session.CreateCriteria(typeof(Salarios)) 
        .List<Salarios>(); 
       transaction.Commit(); 

       cmbMaterial.DataSource = mat; 
       cmbMaterial.DisplayMember = "Nombre"; 
       cmbSalarios.DataSource = sal; 
       cmbSalarios.DisplayMember = "Nombre"; 
       cmbMIndirecta.DataSource = sal; 
       cmbMIndirecta.DisplayMember = "Nombre"; 
      } 
     } 
    } 

    private void btnAddMaterial_Click(object sender, EventArgs e) 
    { 
     materialBindingSource.DataSource = null; 
     //dgvMaterial.DataSource = null; 
     mater.Add((Material)cmbMaterial.SelectedValue); 
     //dgvMaterial.DataSource = mater; 
     dgvMaterial.DataSource = materialBindingSource; 
     materialBindingSource.DataSource = mater; 
     materialBindingSource.ResetBindings(false); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     dgvSalarios.DataSource = null; 
     salar.Add((Salarios)cmbSalarios.SelectedValue); 
     dgvSalarios.DataSource = salar; 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     dgvMIndirecta.DataSource = null; 
     mind.Add((Salarios)cmbMIndirecta.SelectedValue); 
     dgvMIndirecta.DataSource = mind; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     using (var session = sessionFactory.OpenSession()) 
     { 
      using (var transaction = session.BeginTransaction()) 
      { 
       if (prod == null) 
       { 
        prod = new Productos { CargasTurno = float.Parse(txtCargasTurno.Text), CavidadesMolde = int.Parse(txtCavidadesMolde.Text), Clave = txtClave.Text, Comentarios = txtComentarios.Text, MezclasTurno = float.Parse(txtMezclasTurno.Text), Moldes = int.Parse(txtMoldes.Text), Nombre = txtNombre.Text, Peso = float.Parse(txtPesoTotal.Text), TotalPza = int.Parse(txtPzasTotales.Text), Turnos = int.Parse(txtTurnos.Text) }; 
        session.Save(prod); 
        transaction.Commit(); 
       } 
       foreach (DataGridViewRow dr in dgvMaterial.Rows) 
       { 
        Material m = dr.DataBoundItem as Material; 
        m.Materiales 
        PMaterial mat = new PMaterial { Material = dr.DataBoundItem as Material, Cantidad = float.Parse(dr.Cells["Cantidad"].Value.ToString()), Fecha = DateTime.Now, Producto = prod }; 
        session.Save(mat); 
       } 
       transaction.Commit(); 
       session.Close(); 
      } 
     } 
    } 
} 

}

+1

为什么每次都创建一个新的网格? – Jeremy 2010-04-23 18:02:04

回答

0

我会猜想你有一个事件处理程序不开心。什么确切地做消息说?

你可能是具有如果您要添加的相同Material实例列表多次的问题;因为IndexOf只会发现第一个的发生。这条线让我非常怀疑:

mater.Add((Material)cmbMaterial.SelectedValue); 

因为它可能会(连续点击/等)做到这一点。


注:如果您使用BindingList<T>代替你不得不斗是Add(...) - 无需复位:

领域:

BindingList<Material> mater = new BindingList<Material>(); 

INIT格:

dgvMaterial.DataSource = mater; 

添加项目:

mater.Add(newInstance); 
+0

感谢所有我已经改变它使用绑定列表,它的工作就像一个魅力。谢谢 – JaSk 2010-04-23 21:33:05

1

这可能不是问题DGV整个代码,但该组合框。向我们展示填充组合框并设置其属性的代码。

如果要转换为Material类,则应该使用SelectedItem而不是SelectedValue。 (除非你完全知道你在做什么)

0

如果将数据源分配给DGV,则应检查元素数 - 如果为零,则分配空值。我不知道为什么它是这样,但我用我的所有形式来做。

//我仍在分析代码的其余部分

相关问题