C#中DataGridView的错误列中的数据检索
Posted
技术标签:
【中文标题】C#中DataGridView的错误列中的数据检索【英文标题】:Data Retrieval in Wrong Columns of DataGridView in C# 【发布时间】:2019-09-02 20:46:37 【问题描述】:从数据库中检索数据时,它显示在错误的网格视图列中,甚至有些是空的,并且数据显示在错误的列中。
我尝试检查所有内容,但没有找到任何解决方案,我在这里粘贴了一些代码:
注意:我使用 xampp 数据库进行测试。
这是问题的屏幕截图:
public partial class Form1 : Form
public Form1()
InitializeComponent();
gradeView3Intializer();
//ADD TO GDVIEW:
private void populate3(string staffNo, string fName, string lName, string position, string sex, string dob, string salary, string branchNo)
dataGridView3.Rows.Add(staffNo, fName, lName, position, sex, dob, salary, branchNo);
//Retrive Function
private void retrieve3()
dataGridView3.Rows.Clear();
string sql = "SELECT * FROM staff;";
cmd = new mysqlCommand(sql, con);
try
con.Open();
adapter = new MySqlDataAdapter(cmd);
adapter.Fill(dt);
//Loop through dt
foreach (DataRow row in dt.Rows)
populate3(row[0].ToString(), row[1].ToString(), row[2].ToString(), row[3].ToString(), row[4].ToString(), row[5].ToString(), row[6].ToString(), row[7].ToString());
con.Close();
//Clear DT
dt.Rows.Clear();
catch (Exception ex)
MessageBox.Show(ex.Message, "Notice");
con.Close();
//Intializing GradView with Rows
private void gradeView3Intializer()
dataGridView3.ColumnCount = 8;
dataGridView3.Columns[0].Name = "Staff No";
dataGridView3.Columns[1].Name = "First Name";
dataGridView3.Columns[2].Name = "Last Name";
dataGridView3.Columns[3].Name = "Position";
dataGridView3.Columns[4].Name = "SEX";
dataGridView3.Columns[5].Name = "DOB";
dataGridView3.Columns[6].Name = "Salary";
dataGridView3.Columns[7].Name = "Branch No";
dataGridView3.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
// Selection Mode:
dataGridView3.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView3.MultiSelect = false;
private void btnUpdate3_Click(object sender, EventArgs e)
try
string selected = dataGridView3.SelectedRows[0].Cells[0].Value.ToString();
update3(selected, textBox8.Text, textBox7.Text, textBox6.Text, textBox5.Text, textBox25.Text, textBox26.Text, textBox27.Text, textBox28.Text);
catch (Exception ex)
MessageBox.Show(ex.Message, "Notice");
private void btnRetrive3_Click(object sender, EventArgs e)
retrieve3();
private void dataGridView3_MouseClick(object sender, MouseEventArgs e)
try
textBox8.Text = dataGridView3.SelectedRows[0].Cells[0].Value.ToString();
textBox7.Text = dataGridView3.SelectedRows[0].Cells[1].Value.ToString();
textBox6.Text = dataGridView3.SelectedRows[0].Cells[2].Value.ToString();
textBox5.Text = dataGridView3.SelectedRows[0].Cells[3].Value.ToString();
textBox25.Text = dataGridView3.SelectedRows[0].Cells[4].Value.ToString();
textBox26.Text = dataGridView3.SelectedRows[0].Cells[5].Value.ToString();
textBox27.Text = dataGridView3.SelectedRows[0].Cells[6].Value.ToString();
textBox28.Text = dataGridView3.SelectedRows[0].Cells[7].Value.ToString();
catch (Exception ex)
MessageBox.Show(ex.Message, "Notice");
【问题讨论】:
select * 将使用您的数据库决定使用的顺序从表中返回所有列。按您喜欢的顺序准确指定列名 @Steve 我明确定义了SELECT staffNo、fname、lname、position、sex、dob、salary、branchno FROM staff等列;错误仍然存在。当我检查数据库时,记录以正确的顺序正确添加,只是在检索它在错误的数据网格视图行中显示错误数据时,如上图所示。 我会尝试在该 populate3 方法中放置一个断点,并检查您在其参数中收到的数据类型。使用调试器是解决此类“不可能”错误的最快方法。 @Steve 谢谢老兄,我解决了,问题出在 DataTable 和 AutoGeneratingColumns 上。 【参考方案1】:只是一个建议,关于:
string sql = "SELECT * FROM staff;";
您的代码依赖于您期望的索引位置中的结果字段,但 SELECT * 将根据数据库表结构返回数据,这可能与您的期望不符。
最好在 SQL 语句中明确定义所需的字段名称列表。在下面的示例中,即使列在基础表结构中移动,我也可以准确地知道结果字段的位置。
string sql = "SELECT Field1, Field2, Field3 FROM staff;";
【讨论】:
我明确定义了SELECT staffNo、fname、lname、position、sex、dob、salary、branchno FROM staff等列;错误仍然存在。当我检查数据库时,记录以正确的顺序正确添加,只是在检索它在错误的数据网格视图行中显示错误数据时,如上图所示。【参考方案2】:经过一番挣扎,我终于找到了解决办法。我补充说:
dataGridView1.AutoGenerateColumns = true;
dataGridView2.AutoGenerateColumns = true;
dataGridView3.AutoGenerateColumns = true;
到我的代码的每个retrieve()函数并为数据库中的每个表定义一个新的DataTable,代码如下:
// NEW DataTables for each Table in Database
DataTable dt = new DataTable();
DataTable dt2 = new DataTable();
DataTable dt3 = new DataTable();
所以这解决了我的问题:)
【讨论】:
以上是关于C#中DataGridView的错误列中的数据检索的主要内容,如果未能解决你的问题,请参考以下文章
C#中的DATAGRIDVIEW表格可以进行条件筛选的显示数据吗?