PDA

View Full Version : سوال: نحوه جستجو در دیتاگریدویو تحت شرایط خاص



nanoox
یک شنبه 22 اردیبهشت 1392, 13:32 عصر
سلام
دوستان من توی برنامم یه دیتا گرید دارم که میخوام توی سطر اولش بتونم جستجوی ستون به ستون بذارم (یعنی نسبت به هر ستون بتونم سطرهارو جستجو کنم) اما میخوام اطلاعات مابقیه سطرها قابل ویرایش نباشن
چطور میتونم این 2 تا کارو باهم انجام بدم:متفکر:
خییییلی خیلی فوریه لطفا هرکی میتونه کمکم کنه،ممنون میشم:ناراحت:

zayens
دوشنبه 23 اردیبهشت 1392, 09:14 صبح
نه نمیتونه!

nanoox
دوشنبه 23 اردیبهشت 1392, 10:57 صبح
واقعا که..! ممنون.!
:عصبانی:

مهرداد صفا
دوشنبه 23 اردیبهشت 1392, 16:02 عصر
با سلام.
برای اینکه تنها سطر اول قابل ویرایش باشد باید در رویداد 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<DataColumn>().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<DataColumn>().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;

}
}
}