【问题标题】:DataGridView CheckBox Column - Show CheckBox but store StringDataGridView CheckBox Column - 显示 CheckBox 但存储字符串
【发布时间】:2016-01-27 07:29:54
【问题描述】:

这是我的代码:

public partial class Form1 : Form
{
    SqlCommandBuilder cmbl;
    string con = "Data Source=localhost;Initial Catalog=db;Persist Security Info=True;User ID=sa;Password=1234";
    SqlDataAdapter sdaHFP;
    string QueryDgvHFP = "SELECT * FROM HFP";
    DataTable dtHFP;
    SqlConnection cn;

    public Form1()
    {
        InitializeComponent();
    }
    private void Form1(object sender, EventArgs e) 
    {
        sdaHFP = new SqlDataAdapter(QueryDgvHFP, con);
        dtHFP = new DataTable();
        sdaHFP.Fill(dtHFP);

        foreach (DataRow item in dtHFP.Rows)
        {
            int n = dgvHFP.Rows.Add();
            dgvHFP.Rows[n].Cells[0].Value = item["HFP"].ToString();
            dgvHFP.Rows[n].Cells[1].Value = item["YearPeriod"].ToString();
            if (item["Active"].ToString() == "Y")
            {
                dgvHFP.Rows[n].Cells[2].Value = true;
            }
            else
            {
                dgvHFP.Rows[n].Cells[2].Value = false;
            };
            dgvHFP.Rows[n].Cells[3].Value = item["ID"].ToString();
        }
    }

这是将数据从 Sql Query 加载到 DataGridView,我在此代码中添加了一个用于执行更新或插入的按钮:

private void btUpdate_Click(object sender, EventArgs e)
{
    try
    {
        cmbl = new SqlCommandBuilder(sdaHFP);
        sdaHFP.Update(dtHFP);
        MessageBox.Show("Success", "Update", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

当我在DataGridView 中更新/插入数据并单击该更新按钮时,会出现一个成功消息框,但数据库中的数据既未更新也未插入

请帮我解决这个问题,为什么更新按钮不起作用?

非常感谢。

【问题讨论】:

  • @M. Schena 感谢您编辑我的问题。
  • 是什么让你认为你实际上是在使用Update()方法(用于更新UI中的控件)执行UPDATE sql语句?
  • 您应该将DataGridView 绑定到您的DataTable,然后当您更改网格中的单元格值时,更改将应用​​于DataTable。然后你可以使用Update 方法。
  • @RezaAghaei 你能解释一下如何将 DataGridView 绑定到 DataTable,我是 C# 中的菜鸟和绿色。谢谢。
  • @Mac 我为您发布了详细的答案。在答案中,我向您展示了如何将DataGridView 绑定到DataTable,更重要的是,如何使用DataGridViewCheckBoxColumn 编辑您的字符串YN。答案已经过测试并且可以正常工作。

标签: c# .net winforms checkbox datagridview


【解决方案1】:

您应该将DataGridView 绑定到DataTable,然后当您更改单元格值或添加或删除行时,更改将应用​​于DataTable。然后您可以使用TableAdapter 保存数据表更改:

this.dataGridView1.DataSource = dataTable;

注意:要存储true/falseYes/No值,最好在sql server中使用bit数据类型。但在下面的示例中,我假设您需要将值存储为 Y/Nnvarchar(50),并且我设置了 DataGridViewCheckBoxColumn 以支持编辑字符串列。

示例

假设我们有一张桌子Table1:

Column1: int, primary key
Column2: nvarchar(50), Allows Null, Containing Y or N as vaule

我们想在DataGridView 中编辑Table1 的数据:

这里是您可以用来加载、编辑和保存数据的代码:

private DataTable table; 
private SqlDataAdapter dataAdapter;

private void sampleForm_Load(object sender, EventArgs e)
{
    var command = "SELECT * FROM Table1";
    var connection = @"Your connection string";
    table = new DataTable();
    dataAdapter = new SqlDataAdapter(command, connection);
    var commandBuilder = new SqlCommandBuilder(dataAdapter);
    dataAdapter.Fill(table);

    //Set false as default value for Column2
    table.Columns["Column2"].DefaultValue = false;

    var column1 = new DataGridViewTextBoxColumn();
    column1.Name = "Column1";
    column1.DataPropertyName = "Column1";

    var column2 = new DataGridViewCheckBoxColumn();
    column2.Name = "Column2";
    column2.DataPropertyName = "Column2";
    column2.TrueValue = "Y";
    column2.FalseValue = "N";

    this.dataGridView1.Columns.Add(column1);
    this.dataGridView1.Columns.Add(column2);

    //Bind grid to table
    this.dataGridView1.DataSource = table;
}

private void saveButton_Click(object sender, EventArgs e)
{
    //Save data
    this.dataGridView1.EndEdit();
    dataAdapter.Update(table);
}

【讨论】:

  • 点击保存按钮时出错:“当传递带有修改行的 DataRow 集合时,更新需要有效的 UpdateCommand。”然后我在 saveButton 中添加了一些代码:“ SqlCommandBuilder cmbl = new SqlCommandBuilder(dataAdapter); 一切正常。非常感谢......我从你那里学到了很多......
  • 不客气 :) 顺便说一句,答案不需要任何更改。我在sampleForm_Load中使用了命令生成器,然后使用同一个适配器来保存数据,所以我不再需要在saveButton_Click中再次使用命令生成器了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 2020-12-20
  • 1970-01-01
相关资源
最近更新 更多