Azzyloth Ответов: 1

Как редактировать данные в результатах поиска на языке C#


I managed to create a code for my edit button and search button. My edit button is functional. It can edit my data in database, my search code is also functional. My problem is to edit data in search results. Like if i search "naruto", my datagridview will filter all the names that has "naruto" on the database. After i choose and doubleclick on the result, all data will reappear to my textbox. But when i edit that data, it doesn't work. Instead, the first data on my database is the one that is changing not the one that i choose. My edit code is working if i don't search any names and don't choose on the search result. I think the problem is in my Edit codes. Please share your answers. Much better if you have a code examples. THANKS IN ADVANCE!

вот мои коды. пожалуйста помочь...

Что я уже пробовал:

private void JOGridView_DoubleClick(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter("Select * from JobOrder", con);

        if (JOGridView.CurrentCell != null && JOGridView.CurrentCell.Value != null)
        {
            TBName.Text = JOGridView.SelectedRows[0].Cells[0].Value.ToString();
            TBContact.Text = JOGridView.SelectedRows[0].Cells[1].Value.ToString();
            CBStatus.Text = JOGridView.SelectedRows[0].Cells[2].Value.ToString();
            TBModel.Text = JOGridView.SelectedRows[0].Cells[3].Value.ToString();
            TBSerial.Text = JOGridView.SelectedRows[0].Cells[4].Value.ToString();
            TBAccess.Text = JOGridView.SelectedRows[0].Cells[5].Value.ToString();
            TBRB.Text = JOGridView.SelectedRows[0].Cells[6].Value.ToString();
            TBRP.Text = JOGridView.SelectedRows[0].Cells[8].Value.ToString();
            TBIT.Text = JOGridView.SelectedRows[0].Cells[10].Value.ToString();
            CBRamarks.Text = JOGridView.SelectedRows[0].Cells[11].Value.ToString();
            TBCharge.Text = JOGridView.SelectedRows[0].Cells[12].Value.ToString();
            TBRELB.Text = JOGridView.SelectedRows[0].Cells[13].Value.ToString();
        }
    }

 private void BTNEdit_Click(object sender, EventArgs e)
    {
        {
            DialogResult dr;
            dr = MessageBox.Show("Are you sure you want to Edit this record?", "Update Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (dr == DialogResult.Yes)
            {

                DataTable dt = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM JobOrder", con);
                da.Fill(dt);

                dt.Rows[JOGridView.CurrentRow.Index].BeginEdit();


                dt.Rows[JOGridView.CurrentRow.Index][1] = TBName.Text;
                dt.Rows[JOGridView.CurrentRow.Index][2] = TBContact.Text;
                dt.Rows[JOGridView.CurrentRow.Index][3] = CBStatus.Text;
                dt.Rows[JOGridView.CurrentRow.Index][4] = TBModel.Text;
                dt.Rows[JOGridView.CurrentRow.Index][5] = TBSerial.Text;
                dt.Rows[JOGridView.CurrentRow.Index][6] = TBAccess.Text;
                dt.Rows[JOGridView.CurrentRow.Index][7] = TBRB.Text;
                dt.Rows[JOGridView.CurrentRow.Index][8] = DTDR.Text;
                dt.Rows[JOGridView.CurrentRow.Index][9] = TBRP.Text;
                dt.Rows[JOGridView.CurrentRow.Index][10] = DTDF.Text;
                dt.Rows[JOGridView.CurrentRow.Index][11] = TBIT.Text;
                dt.Rows[JOGridView.CurrentRow.Index][12] = CBRamarks.Text;
                dt.Rows[JOGridView.CurrentRow.Index][13] = TBCharge.Text;
                dt.Rows[JOGridView.CurrentRow.Index][14] = TBRELB.Text;
                dt.Rows[JOGridView.CurrentRow.Index][15] = DTDR.Text;

                dt.Rows[JOGridView.CurrentRow.Index].EndEdit();

                SqlCommandBuilder cb = new SqlCommandBuilder(da);
                da.Update(dt);


                displayrecords();

                MessageBox.Show("Selected record has been Updated!", "Done Updating ", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            clearrecords();
        }
    }

    private void TBSearch_KeyUp(object sender, KeyEventArgs e)
    {
        if (TBSearch.Text == " ")
        {

        }
        else
            con.Open();
        SqlCommand cmd = con.CreateCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "Select * from JobOrder where Name  like ('" + TBSearch.Text + "%')";
        cmd.ExecuteNonQuery();
        DataTable dt = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);
        JOGridView.DataSource = dt;

        con.Close();
    }

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

private void TBSearch_KeyUp(object sender, KeyEventArgs e)
{
    using (SqlCommand cmd = con.CreateCommand())
    {
        cmd.CommandText = "SELECT * FROM JobOrder WHERE Name Like @Search + '%'";
        cmd.CommandType = CommandType.Text;
        cmd.Parameters.AddWithValue("@Search", TBSearch.Text);
        
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        
        JOGridView.DataSource = dt;
    }
}

Azzyloth

Тот же результат и с моими кодами. вместо того чтобы редактировать тот, который я выбираю в результате поиска, первые данные из моей базы данных-это тот, который меняется :(

Richard Deeming

Потому что ваша функция "редактировать" загружается все данные, а не данные, отображаемые в таблице.

Вероятно, вам придется использовать первичный ключ таблицы, чтобы обновить только ту запись, которую вы редактируете.

Azzyloth

у меня нет проблем с редактированием, когда все данные находятся в моем datagridview. только в результате поиска. не могли бы вы дать мне пример кода для моей кнопки редактирования? или, может быть, просто пересмотрите его, если он вас устраивает и если вы не заняты.

Richard Deeming

Что такое первичный ключ для JobOrder стол?

Azzyloth

ИДЕНТИФИКАТОР. Я не включил этот идентификатор в свой набор данных, но когда я добавляю новые данные, идентификатор в моей базе данных обновляется. Приращение 1

Azzyloth

Вы создали класс по вашим кодам? я получил сообщение об ошибке: "имя класса '?' не является допустимым идентификатором для этого языка. "

Richard Deeming

Методы в моем ответе относятся к тому же классу, что и методы в вашем вопросе.

Richard Deeming

Какая проблема?

Azzyloth

Необработанное исключение типа "System.Data.SqlClient.SqlException" произошло в System.Data.dll

Дополнительная информация: неверный синтаксис рядом с ключевым словом "WHERE".

Это моя проблема
Мое имя первичного ключа - "ID", и оно находится в первом столбце моей базы данных. когда он пытается поместить dataset в мой datagridview, я всегда удаляю идентификатор. вот почему первый столбец в моем datagridview-это имя, а не идентификатор.

Azzyloth

Теперь он работает. Просто здесь ваш код

ГДЕ
ID = @ID
;";

там есть ";" на нем. Хахаха

БОЛЬШОЕ СПАСИБО, ПРИЯТЕЛЬ!

1 Ответов

Рейтинг:
10

Richard Deeming

Попробуйте что-нибудь вроде этого:

private DataRowView GetCurrentRowData()
{
    if (JOGridView.CurrentCell == null) return null;
    
    int rowIndex = JOGridView.CurrentCell.RowIndex;
    if (rowIndex == -1) return null;
    
    return JOGridView.Rows[rowIndex].DataBoundItem as DataRowView;
}

private void JOGridView_DoubleClick(object sender, EventArgs e)
{
    DataRowView row = GetCurrentRowData();
    if (row != null)
    {
        TBName.Text = Convert.ToString(row["Name"]);
        TBContact.Text = Convert.ToString(row["Contact"]);
        CBStatus.Text = Convert.ToString(row["Status"]);
        TBModel.Text = Convert.ToString(row["Model"]);
        TBSerial.Text = Convert.ToString(row["Serial"]);
        TBAccess.Text = Convert.ToString(row["Access"]);
        TBRB.Text = Convert.ToString(row["RB"]);
        TBRP.Text = Convert.ToString(row["RP"]);
        TBIT.Text = Convert.ToString(row["IT"]);
        CBRamarks.Text = Convert.ToString(row["Remarks"]);
        TBCharge.Text = Convert.ToString(row["Charge"]);
        TBRELB.Text = Convert.ToString(row["RELB"]);
    }
}

private void BTNEdit_Click(object sender, EventArgs e)
{
    DataRowView row = GetCurrentRowData();
    if (row != null)
    (
        DialogResult dr = MessageBox.Show("Are you sure you want to edit this record?", "Update Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (dr == DialogResult.Yes)
        {
            using (var cmd = con.CreateCommand())
            {
                cmd.CommandText = @"UPDATE 
                    JobOrder 
                SET 
                    Name = @Name, 
                    Contact = @Contact, 
                    Status = @Status, 
                    Model = @Model, 
                    Serial = @Serial, 
                    Access = @Access, 
                    RB = @RB, 
                    RP = @RP, 
                    IT = @IT, 
                    Remarks = @Remarks, 
                    Charge = @Charge, 
                    RELB = @RELB 
                WHERE 
                    ID = @ID
                ;";
                
                cmd.CommandType = CommandType.Text;
                
                cmd.Parameters.AddWithValue("@Name", TBName.Text);
                cmd.Parameters.AddWithValue("@Contact", TBContact.Text);
                cmd.Parameters.AddWithValue("@Status", CBStatus.Text);
                cmd.Parameters.AddWithValue("@Model", TBModel.Text);
                cmd.Parameters.AddWithValue("@Serial", TBSerial.Text);
                cmd.Parameters.AddWithValue("@Access", TBAccess.Text);
                cmd.Parameters.AddWithValue("@RB", TBRB.Text);
                cmd.Parameters.AddWithValue("@RP", TBRP.Text);
                cmd.Parameters.AddWithValue("@IT", TBIT.Text);
                cmd.Parameters.AddWithValue("@Remarks", CBRamarks.Text);
                cmd.Parameters.AddWithValue("@Charge", TBCharge.Text);
                cmd.Parameters.AddWithValue("@RELB", TBRELB.Text);
                cmd.Parameters.AddWithValue("@ID", row["ID"]);
                
                con.Open();
                try
                {
                    cmd.ExecuteNonQuery();
                }
                finally
                {
                    con.Close();
                }
            }
            
            displayrecords();
            
            MessageBox.Show("Selected record has been updated!", "Done Updating", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
    
    clearrecords();
}

(Возможно, вам придется исправить имена столбцов, чтобы они соответствовали вашей таблице; я только что догадался, основываясь на ваших именах элементов управления.)


Karthik_Mahalingam

5