با سلام.
برای اینکه تنها سطر اول قابل ویرایش باشد باید در رویداد CellBeginEdit مقدار E.RowIndex را چک کنید و در صورت بیشتر از 0 E.Candcelرا true کنید.
برای جستجو بر اساس خانه های سطر اول ابتدا سلولهای ویرایش شده را به دست می آوریم سپس بر اساس آنها یک درخواست به سرور ارسال می کنیم و مقدار را در یک DataTable نگه می داریم. برای اینکه سطر اول مجددا خالی باشد یک سطر به ابتدای آن اضافه می کنیم و به اعنوان DataGridview.DataSource قرار می دهیم. به این صورت:
//in the name of god
//صل الله علی محمد و آله
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
DataTable table = new DataTable();
static string TableName ="sys.objects";
static string DatabaseName = "master";
SqlDataAdapter adapter = new SqlDataAdapter("", @"server=.\sqlexpress;integrated security=true;database="+DatabaseName+";" );
Action<string, DataTable> FillTable;
public Form1()
{
InitializeComponent();
FillTable = (query, Table) => { adapter.SelectCommand.CommandText = query; adapter.Fill(table); };
FillTable("select * from " + TableName, table);
dataGridView1.DataSource = new DataTable();
DataTable table2 = dataGridView1.DataSource as DataTable;
table2.Columns.AddRange(table.Columns.Cast<DataCol umn>().Select((column) =>new DataColumn(column.ColumnName)).ToArray());
table2.Rows.Add();
foreach (DataRow row in table.Rows) table2.Rows.Add(row.ItemArray);
}
private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
if (e.RowIndex > 0) e.Cancel = true;
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
//انتخاب خانه های پر سطر اول برای جستجو بر اساس آنها
var ColumnsToSearch=(from DataGridViewCell cell in dataGridView1.Rows[0].Cells where cell.Value !=DBNull.Value& cell.Value!=null& cell.Value.ToString()!="" select new {name =dataGridView1.Columns[cell.ColumnIndex].Name,value=cell.Value}).ToArray();
dataGridView1.DataSource = null;
string sql = " select * from " + TableName + " where ";
for (int i = 0; i < ColumnsToSearch.Length; i++) sql += ColumnsToSearch[i].name + " like N'" + ColumnsToSearch[i].value + "' and ";
sql = sql.Substring(0, sql.Length - 4);
table = new DataTable();
FillTable(sql, table);
//یک جدول جدید برای نگهداری نتایج جستجو
DataTable table2 = new DataTable();
//اضافه کردن ستونهای جدول اصلی به جدول جستجو
table2.Columns.AddRange(table.Columns.Cast<DataCol umn>().Select((x) => new DataColumn(x.ColumnName)).ToArray());
//اضافه کردن سطر اول مخصوص جستجو...
table2.Rows.Add();
for (int i = 0; i < ColumnsToSearch.Length; i++) table2.Rows[0][ColumnsToSearch[i].name] = ColumnsToSearch[i].value;
//اضافه کردن مابقی سطرها
foreach (DataRow row in table.Rows) table2.Rows.Add(row.ItemArray);
dataGridView1.DataSource = table2;
}
}
}