【问题标题】:C# - How can I set my Datagrid enabled = false and still have a scrollbar without using readonly()?C# - 如何在不使用 readonly() 的情况下设置我的 Datagrid enabled = false 并且仍然有滚动条?
【发布时间】:2014-12-09 17:12:30
【问题描述】:

我被要求制作一个读取条形码并更新屏幕上的数据表的应用程序,该数据表将在数据收集后更新数据库。

问题是每次读取条码时必须在执行时更新一列,但用户不应该通过在设备键盘上书写来编辑单元格。

所以我尝试将列设置为只读,但是当我这样做时,无法更新数据表上的值,然后我尝试将 DataGrid 设置为启用 = false,但随后滚动条停止工作,我需要它,因为它是一个小型设备,并且用户应该能够看到其他列。

有没有简单的方法来解决这个问题?我正在使用 .net compact 3.5

这是我加载 DataGrid 的按钮代码:

DataTable tabela    = new DataTable();
DataTable codbarras = new DataTable();

private void button1_Click(object sender, EventArgs e)
{
    ultimopedido = textBox1.Text;
    try
    {
        FbDataReader leitor;
        FbDataReader leitorbarras;
        string query1 = "SELECT CAST(0 AS DOUBLE PRECISION)SEPARADO, CAST(ITEMORCAMENTO.SALDOITEMORCA - ITEMORCAMENTO.QUANTITEMSEPARADO AS DOUBLE PRECISION)SALDO, ITEMORCAMENTO.QUANTITEMSEPARADO, ITEMORCAMENTO.SALDOITEMORCA, PRODUTO.PRODUTOID, PRODUTO.REFPROD, PRODUTO.NOMEPROD, PRODUTO.ESTOQUEPED, ITEMORCAMENTO.QUANTITEMORCA, ITEMORCAMENTO.ITEMORCAMENTOID, ORCAMENTO.STATUSORCA";
        query1 += " FROM ORCAMENTO ";
        query1 += " LEFT JOIN ITEMORCAMENTO ";
        query1 += " ON ORCAMENTO.ORCAMENTOID = ITEMORCAMENTO.ORCAMENTOID ";
        query1 += " INNER JOIN PRODUTO ";
        query1 += " ON ITEMORCAMENTO.PRODUTOID = PRODUTO.PRODUTOID ";
        query1 += " WHERE ORCAMENTO.ORCAMENTOID = " + textBox1.Text + " AND ";
        query1 += " ORCAMENTO.STATUSORCA = 4 AND ";
        query1 += " ORCAMENTO.SEPARADO = 0 AND ";
        query1 += " ITEMORCAMENTO.STATUSITEMORCA IN (0,1) ";
        query1 += " ORDER BY PRODUTO.PRODUTOID";
        string queryUp = "UPDATE ORCAMENTO SET SEPARADO = 1 WHERE ORCAMENTOID =" + textBox1.Text;


        leitor = conexao.Executar(Conexao.FbConexao, query1);
        tabela.Load(leitor);
        if (tabela.Rows.Count > 0)
        {
            conexao.Atualizar(Conexao.FbConexao, queryUp);
            dataGrid1.DataSource = tabela;
            DataGridTableStyle ts               = new DataGridTableStyle();
            DataGridColumnStyle celId           = new DataGridTextBoxColumn();
            DataGridColumnStyle celQuantitem    = new DataGridTextBoxColumn();
            DataGridColumnStyle celSaldo        = new DataGridTextBoxColumn();
            DataGridColumnStyle celRef          = new DataGridTextBoxColumn();
            ts.MappingName = tabela.TableName;
            celId.MappingName           = "PRODUTOID";
            celId.HeaderText            = "Id";
            celQuantitem.MappingName    = "SEPARADO";
            celQuantitem.HeaderText     = "Separado";
            celSaldo.MappingName        = "SALDO";
            celSaldo.HeaderText         = "Saldo";
            celRef.MappingName          = "REFPROD";
            celRef.HeaderText           = "Referência";
            celId.Width = 50;
            celQuantitem.Width = 75;
            celSaldo.Width = 50;
            celRef.Width = 75;
            ts.GridColumnStyles.Add(celId);
            ts.GridColumnStyles.Add(celQuantitem);
            ts.GridColumnStyles.Add(celSaldo);
            ts.GridColumnStyles.Add(celRef);
            dataGrid1.TableStyles.Add(ts);

            tabela.Columns["SEPARADO"].ReadOnly = true;

            textBox1.Enabled    = false;
            button1.Enabled     = false;
            textBox2.Enabled    = true;
            button6.Enabled     = true;
            button2.Enabled     = true;
            button3.Enabled     = true;
            button4.Enabled     = true;
            button5.Enabled     = true;
        }
        else
        {
            MessageBox.Show("Não foram encontrados dados disponíveis");
        }

        string query2 = "SELECT B.CODBARRAS, B.PRODUTOID, B.ITEMORCAMENTOID" +
                        " FROM ITEMORCAMENTO A" +
                        " INNER JOIN CODBARRASPRODUTO B" +
                        " ON A.PRODUTOID = B.PRODUTOID" +
                        " WHERE B.ITEMORCAMENTOID = 0 AND" +
                        " A.ORCAMENTOID = " + textBox1.Text + "AND " +
                        " B.ITEMORCAMENTOID = 0";
        leitorbarras = conexao.Executar(Conexao.FbConexao, query2);
        codbarras.Load(leitorbarras);
    }
    catch (Exception E)
    {
        MessageBox.Show(E.Message);
    }
}

【问题讨论】:

  • 请在每个字符串前面使用@,在这种情况下,您不能在每一行都使用+(连接)。还可以使用sql命令参数来避免sql注入,提高你的应用性能!
  • 如果我理解正确的话,问题是条形码输入字段,您希望用户只能使用扫描条目而不是按键来填充它?您应该能够覆盖 onKeyPress(和其他)以不接受密钥输入。由于扫描不会使用这些操作,因此它应该仍然可以工作。我不确定这个,所以请检查并告诉我
  • msdn.microsoft.com/en-us/library/… 有一个如何覆盖文本字段的示例,以便只允许数字,但您应该能够根据您的特定目的使用它

标签: c# .net wpf datagrid compact-framework


【解决方案1】:

我认为只读集合可能适合您。 http://msdn.microsoft.com/en-us/library/ms132474(v=vs.110).aspx

但还有另一种方法,您可以将单元格类型更改为标签或文本块。为此,您需要更改数据网格模板。

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 2019-02-05
    • 2014-04-19
    • 2020-05-03
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多