using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace MyTestDGV_Combobox
{
public partial class Employees : Form
{
string connectionString =
"Integrated Security=SSPI;Persist Security Info=False;" +
"Initial Catalog=Northwind;Data Source=localhost";
public Employees()
{
InitializeComponent();
}
private void Employees_Load(object sender, EventArgs e)
{
try
{
SetUpDataGridView1();
}
catch (SqlException)
{
MessageBox.Show("The connection string <"
+ connectionString
+ "> failed to connect. Modify it "
+ "to connect to a Northwind database accessible to "
+ "your system.",
"ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Application.Exit();
}
}
private void SetUpDataGridView1()
{
dataGridView1.VirtualMode = true;
dataGridView1.AutoSize = true;
dataGridView1.DataSource = Populate("SELECT * FROM Employees");
dataGridView1.TopLeftHeaderCell.Value = "Employees";
dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
// 下面自动产生的列移除 -------------------------------------------------------------------------
// a DataGridViewComboboxColumn could be used instead.
dataGridView1.Columns.Remove(ColumnName.TitleOfCourtesy.ToString());
//dataGridView1.Columns.Remove(ColumnName.ReportsTo.ToString());
//需要增加列
//AddLinkColumn();
AddComboBoxColumns();
// AddButtonColumn();
//AddOutOfOfficeColumn();
}
private void AddComboBoxColumns() //----------------------------------------------------------------
{
//---------------------------****************************************************----------------------------------------------------------
DataGridViewComboBoxColumn comboboxColumn = CreateComboBoxColumn();
SetAlternateChoicesUsingDataSource(comboboxColumn);
//comboboxColumn.HeaderText = "TitleOfCourtesy (via DataSource property)";
dataGridView1.Columns.Insert(0, comboboxColumn);
//comboboxColumn = CreateComboBoxColumn();
//SetAlternateChoicesUsingItems(comboboxColumn);
//comboboxColumn.HeaderText = "TitleOfCourtesy (via Items property)";
//// Tack this example column onto the end.
//DataGridView1.Columns.Add(comboboxColumn);
}
private void SetAlternateChoicesUsingDataSource(DataGridViewComboBoxColumn comboboxColumn)
{
{
comboboxColumn.DataSource = RetrieveAlternativeTitles();
//comboboxColumn.ValueMember = ColumnName.TitleOfCourtesy.ToString();
//comboboxColumn.ValueMember = ColumnName.FirstName.ToString(); //----------------------------------此处修改----------------
comboboxColumn.ValueMember = "CategoryName";
comboboxColumn.DisplayMember = comboboxColumn.ValueMember;
}
}
private DataTable RetrieveAlternativeTitles()//返回选择的标题
{
//return Populate("SELECT distinct TitleOfCourtesy FROM Employees");
// return Populate("SELECT distinct [FirstName] FROM [Employees] "); //----------------------------------此处修改----------------
return Populate("SELECT [CategoryName] FROM [Categories] ");
}
private DataGridViewComboBoxColumn CreateComboBoxColumn()
{
DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
{
//column.DataPropertyName = ColumnName.TitleOfCourtesy.ToString();
//column.HeaderText = ColumnName.FirstName.ToString();// //----------------------------------此处修改----------------
column.HeaderText = "CategoryName";
//column.DataPropertyName = ColumnName.FirstName.ToString(); //----------------------------------此处修改----------------
column.DataPropertyName = "CategoryName";
column.DropDownWidth = 160;
column.Width = 90;
column.MaxDropDownItems = 3;
column.FlatStyle = FlatStyle.Flat;
}
return column;
}
private void AddLinkColumn()
{
throw new NotImplementedException();
}
private DataTable Populate(string sqlCommand)
{
SqlConnection northwindConnection = new SqlConnection(connectionString);
northwindConnection.Open();
SqlCommand command = new SqlCommand(sqlCommand, northwindConnection);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = command;
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
adapter.Fill(table);
return table;
}
private void DataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
//if (IsCheckBoxColumn(e.ColumnIndex))
//{
// string employeeId = GetKey(e);
// if (!inOffice.ContainsKey(employeeId))
// {
// bool defaultValue = false;
// inOffice.Add(employeeId, defaultValue);
// }
// e.Value = inOffice[employeeId];
//}
}
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs anError)
{
MessageBox.Show("Error happened " + anError.Context.ToString());
if (anError.Context == DataGridViewDataErrorContexts.Commit)
{
MessageBox.Show("Commit error");
}
if (anError.Context == DataGridViewDataErrorContexts.CurrentCellChange)
{
MessageBox.Show("Cell change");
}
if (anError.Context == DataGridViewDataErrorContexts.Parsing)
{
MessageBox.Show("parsing error");
}
if (anError.Context == DataGridViewDataErrorContexts.LeaveControl)
{
MessageBox.Show("leave control error");
}
if ((anError.Exception) is ConstraintException)
{
DataGridView view = (DataGridView)sender;
view.Rows[anError.RowIndex].ErrorText = "an error";
view.Rows[anError.RowIndex].Cells[anError.ColumnIndex].ErrorText = "an error";
anError.ThrowException = false;
}
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
//if (IsANonHeaderLinkCell(e))
//{
// MoveToLinked(e);
//}
//else if (IsANonHeaderButtonCell(e))
//{
// PopulateSales(e);
//}
}
enum ColumnName
{
EmployeeId,
LastName,
FirstName,
Title,
TitleOfCourtesy,
BirthDate,
HireDate,
Address,
City,
Region,
PostalCode,
Country,
HomePhone,
Extension,
Photo,
Notes,
ReportsTo,
PhotoPath,
OutOfOffice
};
#region check state
Dictionary<string, bool> inOffice = new Dictionary<string, bool>();
private void dataGridView1_CellValuePushed(object sender, DataGridViewCellValueEventArgs e)
{
if (IsCheckBoxColumn(e.ColumnIndex))
{
string employeeId = GetKey(e);
if (!inOffice.ContainsKey(employeeId))
{
inOffice.Add(employeeId, (Boolean)e.Value);
}
else
{
inOffice[employeeId] = (Boolean)e.Value;
}
}
}
#endregion
private string GetKey(DataGridViewCellValueEventArgs e)
{
return dataGridView1.Rows[e.RowIndex].Cells[ColumnName.EmployeeId.ToString()].Value.ToString();
}
private bool IsCheckBoxColumn(int columnIndex)
{
DataGridViewColumn outOfOfficeColumn = dataGridView1.Columns[ColumnName.OutOfOffice.ToString()];
return (dataGridView1.Columns[columnIndex] == outOfOfficeColumn);
}
}