如何禁用DataGridView中的列的单击?

时间:2016-06-28 04:32:35

标签: c# winforms datagridview

我在WindowsForm上有一个DataGridView,我从我的数据库传递数据。此DataGridView的目的是使用户能够单击某个值并对其进行修改。但是,我不希望用户将值留空,添加单词,只有数字..当然不会更改Id,这是我表的主键。

我正在尝试通过禁用托管表的id的列来实现此目的,但是我不知道如何告诉该列禁用编辑。

这是我的代码:

public partial class eraseGrade : Form
{
    Conexion con;
    String rut;
    DataTable dt;

    SqlDataAdapter sda;
    SqlCommandBuilder scb;

public eraseGrade()
    {
        InitializeComponent();

        cbxAsig.Enabled = false;
        cbxAsig.Enabled = false;
        btnNotas.Enabled = false;
        btnBorra.Enabled = false;
    }

private void btnBuscar_Click_1(object sender, EventArgs e)
    {
        Conexion con = Conexion.saberEstado();

        rut = txtRut.Text.Trim();

        if (validarTXTVacios(txtRut))
        {
            MessageBox.Show("Add a Rut, please");
        }
        else
        {
            Alumno a = new Alumno(rut);
            a.buscar(a);
            cbxAsig.Items.Clear();

            if (a.Nombre != null)
            {
                lblNombre.Text = a.Nombre + " " + a.Apellido;

                cbxAsig.Enabled = true;

                AsignaturaAlumno b = new AsignaturaAlumno();

                List<AsignaturaAlumno> l = b.buscarTodosByAlumno(rut);

                List<String> codigosAsig = new List<string>();

                if (l.Count != 0)
                {
                    for (int i = 0; i < l.Count(); i++)
                    {
                        codigosAsig.Add(l.ElementAt(i).Cod_asig.ToString());
                    }

                    Asignatura asigT = new Asignatura();
                    List<Asignatura> asig = new List<Asignatura>();

                    for (int i = 0; i < codigosAsig.Count(); i++)
                    {
                        asig.Add(asigT.buscarbyCod(codigosAsig.ElementAt(i).ToString()));
                    }

                    for (int i = 0; i < asig.Count(); i++)
                    {
                        cbxAsig.Items.Add(asig.ElementAt(i).CodAsignatura);
                    }

                    cbxAsig.Enabled = true;
                    btnNotas.Enabled = true;


                }

            }
            else
            {
                lblNombre.Text = "";
                MessageBox.Show("Alumno no encontrado");
                lblAsig.Text = "";
                cbxAsig.Enabled = false;
                btnNotas.Enabled = false;
                btnBorra.Enabled = false;

            }

        }
    }

 private void cbxAsig_SelectedIndexChanged(object sender, EventArgs e)
    {
        Conexion con = Conexion.saberEstado();

        Asignatura asignatura = new Asignatura();
        Asignatura l = asignatura.buscarbyCod(cbxAsig.SelectedItem.ToString());

        lblAsig.Text = l.Nombre + " (" + l.IdSeccion + ")";
    }

以下是从数据库获取数据并将其插入DataGridView

的代码
private void btnNotas_Click(object sender, EventArgs e)
    {
        Conexion con = Conexion.saberEstado();

        if (cbxAsig.SelectedItem != null)
        {
            String codigo = cbxAsig.SelectedItem.ToString();

            sda = new SqlDataAdapter(@"SELECT id, num_eval AS Evaluacion, porcentaje AS Porcentaje, nota AS Nota  FROM registro WHERE rut = @rut AND cod_asig = @cod_asig", con.Con);
            sda.SelectCommand.Parameters.AddWithValue("@rut", rut);
            sda.SelectCommand.Parameters.AddWithValue("@cod_asig", codigo);
            dt = new DataTable();
            sda.Fill(dt);
            dataGridView1.DataSource = dt;
            btnBorra.Enabled = true;
}
        else
        {
            MessageBox.Show("Seleccione una asignatura");
        }
    }

    public Boolean validarTXTVacios(TextBox r)
    {

        if (txtRut.Text.Equals(""))
        {
            return true;
        }
        return false;

    }

这是使用列中的新数据更新表的按钮。它不尊重主键或数据类型。

    private void btnBorra_Click(object sender, EventArgs e)
    {

         scb = new SqlCommandBuilder(sda);
         sda.Update(dt);


    }



}
}

2 个答案:

答案 0 :(得分:1)

只需将该列的ReadOnly设置为true,就像这样:

dataGridView1.Columns[0].ReadOnly = true;

您应该将0更改为id的列索引。

编辑:要将列验证为例如int,您可以这样做:

dataGridView1.Columns[0].ReadOnly = true;
dataGridView1.AllowUserToAddRows = false;

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    int x;
    if (int.TryParse(row.Cells[1].Value.ToString(), out x))
    {
        MessageBox.Show("Valid");
    }
}

答案 1 :(得分:0)

您可以通过设置Row.Cells [cellIndex] .Enabled = false来实现此目的。在GridView RowDataBound事件期间。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Cells[cellIndex].Enabled = false;
    }
}

将cellIndex更改为您的实际ID单元索引。