ورود

View Full Version : سوال: تشخیص سلولی از گرید با کلیک



water_lily_2012
یک شنبه 22 بهمن 1391, 13:49 عصر
سلام
یک گرید ایجاد کرده ام با چندین سطر و ستون می خواهم با کلیک روی هر سلول بتوانم شماره سطر و ستون را تشخیص دهم.راهی وجود دارد.
تشکر

مهدی فرزاد
دوشنبه 23 بهمن 1391, 08:16 صبح
سلام
برای تشخیص شماره ستون

MessageBox.Show(datagrid.SelectedCells[0].Column.DisplayIndex.ToString());


برای تشخیص شماره سطر میتونید ابتدا کلاس زیر رو ایجاد کنید

public static class DataGridHelper
{
public static DataGridCell GetCell(DataGridCellInfo dataGridCellInfo)
{
if (!dataGridCellInfo.IsValid)
{
return null;
}

var cellContent = dataGridCellInfo.Column.GetCellContent(dataGridCel lInfo.Item);
if (cellContent != null)
{
return (DataGridCell)cellContent.Parent;
}
else
{
return null;
}
}
public static int GetRowIndex(DataGridCell dataGridCell)
{
// Use reflection to get DataGridCell.RowDataItem property value.
PropertyInfo rowDataItemProperty = dataGridCell.GetType().GetProperty("RowDataItem", BindingFlags.Instance | BindingFlags.NonPublic);

DataGrid dataGrid = GetDataGridFromChild(dataGridCell);

return dataGrid.Items.IndexOf(rowDataItemProperty.GetValu e(dataGridCell, null));
}
public static DataGrid GetDataGridFromChild(DependencyObject dataGridPart)
{
if (VisualTreeHelper.GetParent(dataGridPart) == null)
{
throw new NullReferenceException("Control is null.");
}
if (VisualTreeHelper.GetParent(dataGridPart) is DataGrid)
{
return (DataGrid)VisualTreeHelper.GetParent(dataGridPart) ;
}
else
{
return GetDataGridFromChild(VisualTreeHelper.GetParent(da taGridPart));
}
}
}


و بعد در هر جای برنامه کدی مشایه کد زیر رو بنویسید

if (datagrid.SelectedCells.Count > 0)
{
DataGridCell cell = DataGridHelper.GetCell(datagrid.SelectedCells[0]);
MessageBox.Show(DataGridHelper.GetRowIndex(cell).T oString());
}

water_lily_2012
دوشنبه 23 بهمن 1391, 09:38 صبح
سلام
تشکر از جوابتون
منظورم دیتاگرید نیست. یک گرید ساده گذاشتم با چند تا سطر و ستون و می خواهم تشخیص بدم کاربر روی کدام سلول ها کلیک می کند تا یک شی تکس باکس را درون آن سلول ها قرار دهم.
مثلا اگر روی سلول 1 و 2 و 3 و 4 سطر اول کلیک کرد یک تکس باکس ایجاد بشه و در هر 4 تا خونه قرار بگیره یعنی تغییر ColumnSpan.
تشکر

مهدی فرزاد
دوشنبه 23 بهمن 1391, 12:07 عصر
یک یوزر کنترل درست کنید که زمانی که روی اون کلیک میشه مثلا کنترل تکس باکس رو به خودش اضافه کنه حالا دیگه فرقی نمیکنه در زمان اجرا در کدوم سطر و ستون باشه و شما باید در هنگام بار گذاری صفحه RunTime به تعداد مورد نیاز از این یوزر کنترل رو در سطر و ها و ستون های گرید قرار بدید

water_lily_2012
دوشنبه 23 بهمن 1391, 14:29 عصر
من هم همین کار را انجام دادم البته از Border داخل هر سلول استفاده کردم. فقط چون تعداد سلول ها خیلی زیاده گفتم شاید راه بهتری وجود داشته باشه.

مهدی فرزاد
دوشنبه 23 بهمن 1391, 17:29 عصر
اگر از یوزر کنترل استفاده بشه که همه کدهاش درون خودش هست دیگه زیاد بودن سلول ها موردی نداره و دسته بندی کد برنامه شما هم بهتر میشه