我在使用 NpgsqlCommandBuilder 和 datagridview 时遇到了一些问题。
用数据填充 datagridview 没有问题,但我无法让 updatecommand 工作。
我的代码看起来像这样
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Npgsql;
namespace Golfklubben
{
public partial class LaggTillResultat : Form
{
private databaseConnection dataConnection = new databaseConnection();
private BindingSource bindingSource1 = new BindingSource();
private NpgsqlDataAdapter daResult = new NpgsqlDataAdapter();
public LaggTillResultat()
{
InitializeComponent();
FillTavlingar();
dataGridView1.DataSource = bindingSource1;
FillResultat();
dataGridView1.Columns[0].HeaderText = "Deltagare";
dataGridView1.Columns[1].HeaderText = "Poäng";
}
/// <summary>
/// Metod för att fylla en combobox med tävlingar från databasen med en dataadapter
/// Method for filling a combobox with data from the database
/// </summary>
private void FillTavlingar()
{
DateTime date = DateTime.Now;
string strDate = date.ToString("yyyy-MM-dd");
try
{
DataTable table = new DataTable();
NpgsqlConnection conn = new NpgsqlConnection(dataConnection.getConnection());
NpgsqlDataAdapter da = new NpgsqlDataAdapter();
NpgsqlCommand command = new NpgsqlCommand("SELECT tavlingsID, titel FROM tavlingar WHERE datum > @datum ORDER BY titel ASC;", conn);
command.Parameters.AddWithValue("@datum", strDate);
da.SelectCommand = command;
da.Fill(table);
cbTavling.DataSource = table.DefaultView;
cbTavling.DisplayMember = "titel";
cbTavling.ValueMember = "tavlingsID";
}
catch (Exception err)
{
MessageBox.Show("Ett fel uppstod när tävlingarna skulle hämtas " + err.ToString(), "Fel vid uppdatering av handicap", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Metod för att fylla en datagridview med resultat från databasen
/// Method for filling the datagridview with data from the datbase
/// </summary>
private void FillResultat()
{
if (cbTavling.SelectedValue == null)
{
MessageBox.Show("Det finns ingen tävling idag!\nDialogrutan kommer att stängas.");
this.Close();
}
try
{
NpgsqlConnection conn = new NpgsqlConnection(dataConnection.getConnection());
NpgsqlCommand command = new NpgsqlCommand("SELECT golfid, resultat FROM anmalningar WHERE tavlingsid = @tavlingsID ORDER BY golfid ASC;", conn);
command.Parameters.AddWithValue("@TavlingsID", cbTavling.SelectedValue.ToString());
daResult = new NpgsqlDataAdapter(command);
NpgsqlCommandBuilder cb = new NpgsqlCommandBuilder(daResult);
DataTable dt = new DataTable();
dt.Locale = System.Globalization.CultureInfo.InvariantCulture;
daResult.Fill(dt);
bindingSource1.DataSource = dt;
}
catch (Exception err)
{
MessageBox.Show("FEL" + err.ToString());
}
}
private void btnSpara_Click(object sender, EventArgs e)
{
try
{
daResult.Update((DataTable)bindingSource1.DataSource);
}
catch (Exception err)
{
MessageBox.Show(err.ToString());
}
FillResultat();
}
private void cbTavling_SelectedIndexChanged(object sender, EventArgs e)
{
FillResultat();
}
/// <summary>
/// Hanterar formclosing eventet som körs när formuläret håller på att stängas, gömmer formuläret istället för att stänga det.
/// Det här är för att det annars inte går att öppna upp formuläret igen.
/// </summary>
/// <param name="e"></param>
protected override void OnFormClosing(FormClosingEventArgs e)
{
this.Hide();
e.Cancel = true;
}
private void btnAvbryt_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("Vill du stänga formuläret?", "Stänger formuläret", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (result == DialogResult.Yes)
{
this.Hide();
}
else
return;
}
}
}
我已经使用 MSDN 的这个教程来尝试解决这个问题。 MSDN