【问题标题】:MySql Change DataGridView InformationMySql 更改 DataGridView 信息
【发布时间】:2017-05-14 03:33:19
【问题描述】:

我编写了一个简单的程序,它从MySQL 填充数据网格。

在我的一个专栏中,我有一个布尔值(0 或 1)

一旦 Datagrid 填充了查询,我就有了布尔值的复选框。

当您选中布尔值的复选框时,有谁知道如何使用函数? (这是仅发送列的布尔值的更新。)

总而言之,当复选框被选中时,它会将 MySQL 数据库中的布尔值从 0 更改为 1。

我遇到这个问题的原因仅仅是因为在我运行应用程序之前不会填充 Datagrid。因此,我无法弄清楚如何在 Visual Studio 中更改它。

如何填充 DGV:

MySqlConnection conn = new MySqlConnection(dbConnection);
conn.Open();
MySqlCommand cmd = new MySqlCommand();

cmd.Connection = conn;
MySqlDataAdapter da = new MySqlDataAdapter();

//SQL Query String
string sqlSelectAll = "SELECT * FROM `Tasks` WHERE `Completed` = 0";
da.SelectCommand = new MySqlCommand(sqlSelectAll, conn);

DataTable table = new DataTable();
da.Fill(table);

BindingSource bSource = new BindingSource();
bSource.DataSource = table;

dataGridView1.DataSource = bSource;

任何帮助将不胜感激。

注意:

我尝试在 VS2015 中使用数据配置管理器,结果导致完全不同的错误,与此无关。所以这是不可能的。

【问题讨论】:

  • 你需要澄清你在问什么。该复选框表示数据库中 bool 列的状态,因此在表单加载和 DGV 填充之前您当然不会看到它。您当然可以使用 data 来做任何事情,但根本不清楚那是什么,即change it while in visual studio
  • 当您单击复选框时,我希望它更改 mysql 数据库中的布尔值。所以我只是想弄清楚如何做到这一点。
  • 如果您在用户单击或更改任何内容时使用 DataTable 作为数据源,则更改将存储在 DataTable 中 - DGV 就是我们向用户显示数据的方式。然后使用 DataAdapter 将这些更改写回数据库。我怀疑您手动填充 DGV?
  • This answer should help youda.Update(table);
  • 很公平,再次感谢并支持您的 OP

标签: c# mysql .net datagridview dataadapter


【解决方案1】:

如果您要坚持 DataAdapter,它将为您将所有更改应用到基础 DataTable - 实际上是倍数:

要重用的第一类级别对象:

public partial class Form1 : Form

    MySQLDataAdapter myDA;
    DataTable myDT;
    string dbConnStr = "server=..."

然后你在哪里初始化一切:

string sql = "SELECT A, B, C, D... FROM `Tasks`";

// create the DT
myDT = new DataTable();

// The Adapter can create its own Connection 
//     and SelectCommand
myDA = new MySqlDataAdapter(sql, dbConnStr);

MySqlCommandBuilder cb = new MySqlCommandBuilder(myDA);

// "teach" the DA how to Update and Add:
myDA.UpdateCommand = cb.GetUpdateCommand();
myDA.InsertCommand = cb.GetInsertCommand();
myDA.DeleteCommand = cb.GetDeleteCommand();

myDA.Fill(myDT);
myDA.FillSchema(myDT, SchemaType.Source);

dgv1.DataSource = myDT;

这应该在 DGV 中创建所有需要的列并用行填充它。你拥有/知道的那部分。单击 2-3 个复选框以更改值,然后在按钮上按添加:

int rows = myDA.Update(myDT);

在调试下,如果您检查rows 的值,它将与您更改的复选框数一样多。它还可以插入、删除或更新需要该操作的任意数量的行。

  • 无需创建连接。使用 MySqlDataAdapter(string, string) 构造函数重载,您传递连接字符串,它会创建一个连接供自己使用。
  • 同样,它为 SELECT 命令创建一个 DBCommand 对象
  • MySQLCommandBuilder 然后使用 SelectCommand 创建 DataAdapter 将使用的更新、删除等命令。这允许您发出 1(一个)Update 方法调用来更新 1、10 或 1000 行。
  • 处理单个表时,您的应用中可能不需要任何其他 SQL
  • DataAdapter 具有连接字符串,因此它会打开和关闭自己的连接。

如果您为DataTable 定义PrimaryKey,DA 还可以刷新数据 - 如果其他用户对应用程序外部的表进行了更改,那么您可以获取这些新行。使用自己的更改进行更新后:

var rows = myDA.Fill(myDT);

这是一个实际的刷新 - 它只会加载新行以及对任何现有行的任何更改。请注意,原始 SQL 中的 WHERE 子句仍然适用。

如您所见,DataAdapter 的功能远不止填充DataTables;如果您只需要这样做,您可以使用DbCommandDataReader

myDt.Load(cmd.ExecuteReader()):

【讨论】:

  • 好的,在发帖之前我的代码几乎完全一致:) 但是我遇到了命令生成器的问题。 cb.GetxCommand 正在返回 cannot convert method group GetxCommand to non-delegate type MySqlCommand. Did you intend to Invoke a Method? 的错误,当我说这似乎是我不需要的东西时,我无法理解...
  • 它们是方法,所以最后需要 () - () 在 VB 中是可选的(我从那个 VB 答案开始快速翻译)。
  • 天啊,我真是个混蛋。完美运行..我太愚蠢了。我不敢相信我刚刚问了这个问题......在方法结束时我真的只是想念()......我知道这意味着什么。我的大脑在自动驾驶......但是,因为你,我学到了很多关于数据网格的东西:)
  • @Plutonix,当您谈论其他用户是否通过使用数据适配器进行更改以在发生这种情况时刷新页面时......您可以将我链接到一些文档吗?您是指通过数据库还是其他方式的父子键?
  • 不,如果 UserA 在 FooBar 表中添加一行,您可以使用 Fill 在 UserB 的应用程序实例中“拾取”这些新行,或者如果 UserB 更改某项的状态,则 UserA 可以拾取它向上。也适用于您可能在 UI DB 浏览器工具中进行的更改。它是 DbDataAdapeter 功能的一部分
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多