Как выполнить изменения стиля в строках представления данных, используя строки из базового источника связывания? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть приложение win forms, которое позволяет пользователям вставлять или обновлять таблицу SQL.Когда пользователь нажимает «загрузить», данные в сетке данных объединяются в таблицу SQL.Я хочу, чтобы строка в datagridview меняла цвет, чтобы указать вставку или обновление.

Я не знаю, как связать строку datagridview с базовой строкой в ​​источнике связывания.Пожалуйста, посмотрите мой комментарий "Помогите!"ниже

partial class Form1 : Form
{
    SqlConnection _con;
    BindingSource _bs;
    DataTable _dt;

    public Form1()
    {
        // START 
        InitializeComponent();

        // SQL connection
        _con = new SqlConnection(connString);

        // Data binding
        _bs = new BindingSource();
        _dt = new DataTable();
        dataGridView1.DataSource = _bs;
        _bs.DataSource = _dt;            
    }

    /// <summary>
    /// Converts the datagridview into a datatable
    /// </summary>
    /// <param name="dgv"></param>
    /// <returns></returns>
    private DataTable GetDataTableFromDGV(DataGridView dgv)
    {
        var dt = new DataTable();
        foreach (DataGridViewColumn column in dgv.Columns)
        {
            if (column.Visible)
            {
                dt.Columns.Add(column.Name.ToString());
            }
        }

        object[] cellValues = new object[dgv.Columns.Count];
        foreach (DataGridViewRow row in dgv.Rows)
        {
            for (int i = 0; i < row.Cells.Count; i++)
            {
                cellValues[i] = row.Cells[i].Value;
            }
            if ((string)cellValues[0] != "" && (string)cellValues[1] != "" && cellValues[0] != null && cellValues[1] != null)
                dt.Rows.Add(cellValues);
        }

        return dt;
    }

    private void btnUpload_Click(object sender, EventArgs e)
    {
        //Store errors to output to user at the end
        StringBuilder ts = new StringBuilder();

        _dt = GetDataTableFromDGV(dataGridView1);
        if(_dt.Rows.Count > 0)
        {
            _con.Open();

            foreach (DataRow dr in _dt.Rows)
            {
                using (SqlCommand command = new SqlCommand())
                {
                    int returnVal;

                    command.Connection = _con;
                    command.CommandType = CommandType.StoredProcedure;
                    command.CommandText = "dbo.InsertZebraLocationXRef";

                    SqlParameter param1 = new SqlParameter
                    {
                        ParameterName = "@Horse",
                        Value = dr.Field<String>("Horse"),
                        SqlDbType = SqlDbType.VarChar
                    };
                    SqlParameter param2 = new SqlParameter
                    {
                        ParameterName = "@Zebra",
                        Value = dr.Field<String>("Zebra"),
                        SqlDbType = SqlDbType.VarChar
                    };

                    command.Parameters.Add(param1);
                    command.Parameters.Add(param2);

                    try
                    {
                        returnVal = (int)command.ExecuteScalar(); //this returns 0 for insert, 1 for update
                        MessageBox.Show(returnVal.ToString());
                    }
                    catch (SqlException ex)
                    {
                        if (ex.Number == 2627)
                        {
                            ts.Append("Primary key constraint violated when entering " + dr.Field<string>("Horse") + " " + dr.Field<string>("Zebra") + Environment.NewLine);
                        }
                        if (ex.Number == 515)
                        {
                            ts.Append("Cannot insert null value" + Environment.NewLine);
                        }
                        Debug.WriteLine(ex.ToString());
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine(ex.ToString());
                    }

                    // Help! I want to update the DGV row style here based on the returnVal                     
                }
            }

            // Output errors to screen
            if (ts.Length > 0)
            {
                ts.Append(Environment.NewLine + "The other rows were added successfully." + Environment.NewLine + Environment.NewLine + "Press CTRL + C to copy this box to your clipboard. Please email it to the helpdesk.");
                MessageBox.Show(ts.ToString(), "Written by Vic Street", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                MessageBox.Show("Upload complete", "Upload complete", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            _con.Close();

        }
    }
}

Редактировать для будущих читателей: я решил проблему, добавив еще один столбец «Стиль» в таблицу данных и изменив код:

                    if (dr.Field<String>("Style") == "1")
                        dataGridView1.Rows[_dt.Rows.IndexOf(dr)].DefaultCellStyle.BackColor = Color.Red;
                    if (dr.Field<String>("Style") == "0")
                        dataGridView1.Rows[_dt.Rows.IndexOf(dr)].DefaultCellStyle.BackColor = Color.Green;

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Попробуйте использовать событие CellFormatting, чтобы установить цвет ваших строк на основе статуса строки RowState:

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
  if (e.RowIndex < _dt.Rows.Count) {
    if (_dt.Rows[e.RowIndex].RowState == DataRowState.Added) {
      dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
    } else if (_dt.Rows[e.RowIndex].RowState == DataRowState.Modified) {
      dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Blue;
    }
  }
}
0 голосов
/ 13 декабря 2018

Если я вас правильно понял, вы можете попробовать что-то вроде этого:

DataGridViewCellStyle highlightCellStyle = new DataGridViewCellStyle();
highlightCellStyle.BackColor = Color.Green;
dataGridView1.CurrentRow.DefaultCellStyle = highlightCellStyle;

Для базового цвета на стиле возврата не должно быть вопроса, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...