объекты в datagridview - PullRequest
       13

объекты в datagridview

1 голос
/ 23 апреля 2010

Я добавляю объекты в сетку данных (только один вид) через список EJ. </p> <pre><code>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();
            }
        }
    }
}

}

Ответы [ 3 ]

1 голос
/ 23 апреля 2010

Это, вероятно, не проблема DGV, но с этим комбинированным окном. Покажите нам код, который заполняет поле со списком и устанавливает его свойства.

Если вы преобразуетесь в класс Material, вам, вероятно, следует использовать SelectedItem вместо SelectedValue. (если вы точно не знаете, что делаете)

0 голосов
/ 23 апреля 2010

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

// Я все еще анализирую остальную часть кода

0 голосов
/ 23 апреля 2010

Я бы предположил , что у вас есть обработчик событий, который не устраивает. Что точно говорит сообщение?

Вы можете также испытывать проблемы, если добавляете один и тот же Material экземпляр в список несколько раз; поскольку IndexOf найдет только первое вхождение. Эта строка делает меня очень подозрительным:

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

поскольку он потенциально (при последовательных щелчках / и т. Д.) Может сделать именно это.


Примечание: если вы использовали BindingList<T>, вместо этого все, что вам нужно было бы сделать, это Add(...) - сброс не требуется:

поля:

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

Начальная сетка:

dgvMaterial.DataSource = mater;

добавить товар:

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