【问题标题】:Bound DataGridView TableAdapter Update绑定 DataGridView TableAdapter 更新
【发布时间】:2017-09-07 20:37:08
【问题描述】:

绑定到数据库表的 DataGridView。我已经使用由 CellEndEdit 事件触发的更新命令设置了一个表格适配器,但是我在调​​用更新时遇到了一些麻烦。

更新命令:

UPDATE       dbo.EpsProgramacaoSubmontagem
SET                GUID = @GUID, CascoID = @CascoID, Casco = @Casco, BlocoID = @BlocoID, Bloco = @Bloco, Sub = @Sub, SSub = @SSub, Linha = @Linha, 
                         Quantidade = @Quantidade, Peso = @Peso, [Inicio Plan Montagem] = @Inicio_Plan_Montagem, Oficina = @Oficina, 
                         [Inicio Plan Submontagem] = @Inicio_Plan_Submontagem, [Termino Plan Submontagem] = @Termino_Plan_Submontagem, [Temino Real] = @Temino_Real, 
                         Turno = @Turno, [Status Processamento] = @Status_Processamento, [Status Sub] = @Status_Sub, [Data ] = @Data_
WHERE        (GUID = @Original_GUID)

上面的每个 TableAdapter.Update 参数都与 DataGridView 列相关。我已经尝试过了:

private void SubProgDGV_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        //UPDATE DE LINHA
        DataGridViewRow row = SubProgDGV.Rows[e.RowIndex];
        Guid guid = (Guid)row.Cells["gUIDDataGridViewTextBoxColumn"].Value;
        int cascoid = Convert.ToInt16(row.Cells["cascoIDDataGridViewTextBoxColumn3"].Value);
        string casco = row.Cells["cascoDataGridViewTextBoxColumn11"].Value.ToString();
        int blocoid = Convert.ToInt16(row.Cells["blocoIDDataGridViewTextBoxColumn5"].Value);
        string bloco = row.Cells["blocoDataGridViewTextBoxColumn11"].Value.ToString();
        string sub = row.Cells["subDataGridViewTextBoxColumn1"].Value.ToString();
        string ssub = row.Cells["sSubDataGridViewTextBoxColumn1"].Value.ToString();
        string linha = row.Cells["linhaDataGridViewTextBoxColumn"].Value.ToString();
        int qtd = Convert.ToInt16(row.Cells["quantidadeDataGridViewTextBoxColumn3"].Value);
        double peso = Convert.ToDouble(row.Cells["pesoDataGridViewTextBoxColumn4"].Value);
        DateTime datacmb = Convert.ToDateTime(row.Cells["inicioPlanMontagemDataGridViewTextBoxColumn"].Value);
        string oficina = row.Cells["oficinaDataGridViewTextBoxColumn"].Value.ToString();
        DateTime datasub = Convert.ToDateTime(row.Cells["inicioPlanSubmontagemDataGridViewTextBoxColumn"].Value);
        DateTime datasubfim = Convert.ToDateTime(row.Cells["terminoPlanSubmontagemDataGridViewTextBoxColumn"].Value);
        DateTime datatermino = row.Cells["teminoRealDataGridViewTextBoxColumn"].Value == DBNull.Value ? DateTime.MinValue : Convert.ToDateTime(row.Cells["teminoRealDataGridViewTextBoxColumn"].Value);
        string turno = row.Cells["turnoDataGridViewTextBoxColumn"].Value.ToString();
        string statusproc = row.Cells["statusProcessamentoDataGridViewTextBoxColumn"].Value.ToString();
        string statussub = row.Cells["statusSubDataGridViewTextBoxColumn"].Value.ToString();
        DateTime data = row.Cells["dataDataGridViewTextBoxColumn1"].Value == DBNull.Value ? DateTime.MinValue : Convert.ToDateTime(row.Cells["dataDataGridViewTextBoxColumn1"].Value);

        this.epsProgramacaoSubmontagemTableAdapter.Update(cascoid, casco, blocoid, bloco, sub, ssub, linha, qtd, peso, datacmb, oficina, datasub, datasubfim, datatermino, turno, statusproc, statussub, data , guid );
    }

但是,每当其中一个 datetimes 参数为 null 时,它都会引发异常。有没有更好的方法来处理这个问题?由于我已经设置了 DGV 列和 SQL 参数之间的关系,不应该是一个简单的方法吗?

【问题讨论】:

  • 可能使用可为空的日期时间(DateTime?)
  • 有什么例外?为变量赋值是例外,还是尝试更新表时例外?
  • WithMetta - DateTime 不可为空。

标签: c# database datagridview


【解决方案1】:

我认为您的空日期单元格值实际上不会== DBNull.Value 如果您尝试这样做呢?

DateTime data = row.Cells["dataDataGridViewTextBoxColumn1"].Value == null ? DateTime.MinValue : Convert.ToDateTime(row.Cells["dataDataGridViewTextBoxColumn1"].Value);

或者甚至可以在.FormattedValue 上使用string.IsNullOrEmpty() 进行类似的操作

DateTime data = string.IsNullOrEmpty((string)row.Cells["dataDataGridViewTextBoxColumn1"].FormattedValue) ? DateTime.MinValue : Convert.ToDateTime(row.Cells["dataDataGridViewTextBoxColumn1"].Value);

.

//UPDATE DE LINHA
DataGridViewRow row = SubProgDGV.Rows[e.RowIndex];
Guid guid = (Guid)row.Cells["gUIDDataGridViewTextBoxColumn"].Value;
int cascoid = Convert.ToInt16(row.Cells["cascoIDDataGridViewTextBoxColumn3"].Value);
string casco = row.Cells["cascoDataGridViewTextBoxColumn11"].Value.ToString();
int blocoid = Convert.ToInt16(row.Cells["blocoIDDataGridViewTextBoxColumn5"].Value);
string bloco = row.Cells["blocoDataGridViewTextBoxColumn11"].Value.ToString();
string sub = row.Cells["subDataGridViewTextBoxColumn1"].Value.ToString();
string ssub = row.Cells["sSubDataGridViewTextBoxColumn1"].Value.ToString();
string linha = row.Cells["linhaDataGridViewTextBoxColumn"].Value.ToString();
int qtd = Convert.ToInt16(row.Cells["quantidadeDataGridViewTextBoxColumn3"].Value);
double peso = Convert.ToDouble(row.Cells["pesoDataGridViewTextBoxColumn4"].Value);
DateTime datacmb = Convert.ToDateTime(row.Cells["inicioPlanMontagemDataGridViewTextBoxColumn"].Value);
string oficina = row.Cells["oficinaDataGridViewTextBoxColumn"].Value.ToString();
DateTime datasub = Convert.ToDateTime(row.Cells["inicioPlanSubmontagemDataGridViewTextBoxColumn"].Value);
DateTime datasubfim = Convert.ToDateTime(row.Cells["terminoPlanSubmontagemDataGridViewTextBoxColumn"].Value);
DateTime datatermino = row.Cells["teminoRealDataGridViewTextBoxColumn"].Value == null ? DateTime.MinValue : Convert.ToDateTime(row.Cells["teminoRealDataGridViewTextBoxColumn"].Value);
string turno = row.Cells["turnoDataGridViewTextBoxColumn"].Value.ToString();
string statusproc = row.Cells["statusProcessamentoDataGridViewTextBoxColumn"].Value.ToString();
string statussub = row.Cells["statusSubDataGridViewTextBoxColumn"].Value.ToString();
DateTime data = row.Cells["dataDataGridViewTextBoxColumn1"].Value == null ? DateTime.MinValue : Convert.ToDateTime(row.Cells["dataDataGridViewTextBoxColumn1"].Value);

【讨论】:

    【解决方案2】:

    我发现的唯一方法是检查它是否为空或不使用 IsDBNull 如下代码,只记得始终使用 DateTime?在所有情况下都允许为 null

    DateTime?  PrintDate =  reader.IsDBNull(reader.GetOrdinal("PrintDate")) ? (DateTime?)null :  DateTime.Parse(reader.GetString(reader.GetOrdinal("PrintDate")))
    

    这个解决方案有一些性能价格,但它可以工作

    【讨论】:

    • 并不是说错了,但是,您正在根据reader 中存储的数据检查DBNull,他/她正在尝试评估DataGridViewCell 的内容。
    【解决方案3】:

    我找不到关于检查 null 或解决方法的解决方案,而是使用 DataGridViewDataBindSource_CurrentItemChanged 事件。 每次发生更改时都会触发并自动将更改应用到 DB,我认为这应该自动构建,因为在绑定的 DataGridView 上选择启用编辑。

    【讨论】:

    • 这个解决方案没有意义。您正在检查行上的每个单元格,无论您检查when,空字符串将保持为空字符串,null 将保持为空。除非您的代码中的其他内容有所不同,否则我看不出对不同事件执行相同操作如何解决您的问题。
    • 我已经放弃了之前的策略,而是使用了这个: XBindingSource_CurrentItemChanged(object sender, EventArgs e) { foreach (DataRowView item in (BindingSource)sender) { if (item != null) { DataRow ThisDataRow = ((DataRowView)item).Row; if (ThisDataRow.RowState == DataRowState.Modified) { this.epsProgramacaoSubmontagemTableAdapter.Update(ThisDataRow); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2015-11-04
    • 2011-09-23
    • 2011-07-28
    • 2013-06-10
    • 2011-03-14
    相关资源
    最近更新 更多