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的错误列中的数据检索的主要内容,如果未能解决你的问题,请参考以下文章

从 DataGridView 列中获取值,最后为空行 c#

关于C#中datagridview 列计算问题

C#中的DATAGRIDVIEW表格可以进行条件筛选的显示数据吗?

C# Winform DataGridView在列中使用DateTimePicker控件

使用C#删除datagridview和数据库中的行

C#根据gridview组合框更改gridview列数据?