如何从DataGridView中禁用单击列

本文关键字:单击 DataGridView | 更新日期: 2023-09-27 17:51:22

我在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);

    }

}
}

如何从DataGridView中禁用单击列

像这样设置ReadOnlytrue:

dataGridView1.Columns[0].ReadOnly = true;

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

EDIT:要验证一个列是否为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");
    }
}

您可以通过设置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单元格索引。