【发布时间】: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