PDA

View Full Version : طراحی دیتا گرید با ستون چک باکس دار برای هر ردیف مثل(inbox yahoo mail)



helpsos
سه شنبه 05 شهریور 1392, 16:01 عصر
با سلام
می خواستم بدونم چطوری میشه دیتا گریدی داشت که یه ستون داشته باشه که داخلش چک باکس باشه
و برای هر ردیف از دیتا گرید این چک باکس وجود داشته باشد؟
در کل:
یه چیزی تو مایه های inbox yahoo mail و چطوری می شه با ستون هایی که انتخاب شدن کار کرد؟
با تشکر

helpsos
سه شنبه 05 شهریور 1392, 22:38 عصر
با سلام
من یه لینکی پیدا کردم که به موارد زیر گیر میده و برنامه اجرا نمیشه .
GetDataGridRows
FindAncestor<DataGridRow>
Connections
میگه که اینا رو نمی شناسه.
اگه یه سری به این سایت بزنید و مشکل من رو حل کنید ممنون میشم.
http://dotnetgenetics.blogspot.com/2012/09/add-checkbox-in-wpf-datagrid.html
البته با ف ی ل ت ر ش ک ن باید بازش کنید چون بحث علمی داخلش است

اینم نمونه کد برای کسایی که مشتاق اند.<DataGrid Name="dgProducts" AutoGenerateColumns="False" Grid.Row="1" Grid.RowSpan="3" Grid.ColumnSpan="2" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=ProductName}" Width="215"/>
<DataGridTextColumn Header="Price" Binding="{Binding Path=UnitPrice}"/>
<DataGridTextColumn Header="Quantity Per Unit" Binding="{Binding Path=QuantityPerUnit}" Width="180"/>
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<CheckBox Content="Discontinue All" Click="CheckBox_Click" />
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="chkDiscontinue" IsChecked="{Binding Path=Discontinue,Mode=TwoWay}" Margin="45 2 0 0" Click="chkDiscontinue_Click" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
C-sharp code:
/// <summary>
/// check all checkbox
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
var row = GetDataGridRows(dgProducts);
if (((CheckBox)sender).IsChecked == true)
{
SetCheckbox(row, true);
}
else
{
SetCheckbox(row, false);
}
}
//individual checking of checkbox
private void chkDiscontinue_Click(object sender, RoutedEventArgs e)
{
object a = e.Source;
CheckBox chk = (CheckBox)sender;
DataGridRow row = FindAncestor<DataGridRow>(chk);
if (row != null)
{
DataRowView rv = (DataRowView)row.Item;
//LINQ or Database Method to Update Product discontinue status
Connections.UpdateProductDiscontinue((bool)chk.IsC hecked, rv["ProductName"].ToString());
}
}
//loop through each row and change the checkbox value
private void SetCheckbox(IEnumerable<DataGridRow> row, bool value)
{
//loop through datagrid rows
foreach (DataGridRow r in row)
{
DataRowView rv = (DataRowView)r.Item;
foreach (DataGridColumn column in dgProducts.Columns)
{
if (column.GetType().Equals(typeof(DataGridTemplateCo lumn)))
{
rv.Row["Discontinue"] = value;
//LINQ or Database Method to Update Product discontinue status
Connections.UpdateProductDiscontinue(value, rv.Row["productname"].ToString());
}
}
}
}

helpsos
چهارشنبه 06 شهریور 1392, 09:52 صبح
با سلام به همه کسایی که اینو بلدن و جواب نمیدن:تشویق:

در قسمت 1001 نکته در wpf روشی برای قراردادن check box در datagrid گفته اند که من اونرا انجام دادم ولی عمل نکرد
کد این بود

<dg:DataGridTemplateColumn>
<dg:DataGridTemplateColumn.HeaderTemplate>
<DataTemplate x:Name="Checking">
<CheckBox x:Name="CheckBoxClickAll" Click="CheckBoxClickAll" Content="{Binding}" IsChecked="False" IsThreeState="False"/>
</DataTemplate>
</dg:DataGridTemplateColumn.HeaderTemplate>
<dg:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Width="14" VerticalAlignment="Center" IsChecked="{Binding Selecting, UpdateSourceTrigger=PropertyChanged}" x:Name="LocalColumnCheckbox" />
</DataTemplate>
</dg:DataGridTemplateColumn.CellTemplate>
</dg:DataGridTemplateColumn>


متد
private void CheckBoxClickAll(object sender, RoutedEventArgs e)
{
var checkBox = e.OriginalSource as CheckBox;

if (checkBox != null && checkBox.Name == "CheckBoxClickAll")
{
if (checkBox.IsChecked.GetValueOrDefault(false))
{
//Checked
}
else
{
//UnChecked
}
}
}
به جای //Checked و //UnChecked باید چه چیزی نوشت؟
ممنون میشم اگه جواب بدین خیلی گیرم
با تشکر

mymina
چهارشنبه 06 شهریور 1392, 11:18 صبح
سلام دوست عزیز من هم به این مشکل بر خورد کردم و این شیوه ایی که خودم درست کردم ولی یکم با روش بالا فرق میکنه ولی کار میکنه


<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="106" HorizontalAlignment="Left" Margin="5,6,0,0" Name="dgBlock" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="660" FlowDirection="RightToLeft" SelectionChanged="dgBlock_SelectionChanged">
<DataGrid.Columns>
<DataGridTemplateColumn Width="80" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="chkPerson" Background="Red" VerticalAlignment="Center" IsChecked="False" Tag="{Binding Path=IdBlock}" HorizontalAlignment="Center" HorizontalContentAlignment="Center" Click="chkPerson_Click" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn x:Name="IdBlock" Binding="{Binding Path=IdBlock}" Header="نام بلوک" Width="SizeToHeader" />
<DataGridTextColumn x:Name="NameBlock" Binding="{Binding Path=NameBlock}" Header="نام بلوک " Width="100" />

</DataGrid.Columns>

</DataGrid>

<CheckBox Content="انتخاب همه" Height="22" HorizontalAlignment="Left" Margin="672,534,0,0" x:Name="chkBSelectAll" VerticalAlignment="Top" Checked="chkBSelectAll_Checked" Width="92" FontFamily="B Homa" FlowDirection="RightToLeft" />


در قسمت کد C#‎
تابع زیر برای جستجوی یک کنترل در کنترل دیگر است که تو خیلی جاهای دیگه هم استفاده می کنم و پر کاربرد است

//------------------جستجو کنترل ها در برنامه --------------------------------------//

public IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
int depObjCount = VisualTreeHelper.GetChildrenCount(depObj);
for (int i = 0; i < depObjCount; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}

if (child is GroupBox)
{
GroupBox gb = child as GroupBox;
Object gpchild = gb.Content;
if (gpchild is T)
{
yield return (T)child;
child = gpchild as T;
}
}

foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}


//---------انتخاب همه ردیف ها

private void chkBSelectAll_Checked(object sender, RoutedEventArgs e)
{
foreach (CheckBox com in FindVisualChildren<CheckBox>(dgBlock))
{
com.IsChecked = true;


}
}
//------------لیست ردیف های انتخاب شده



foreach (CheckBox com in FindVisualChildren<CheckBox>(dgBlock))
{
if (com.IsChecked == true)
listBox1.Items.Add(com.Tag);


}

helpsos
چهارشنبه 06 شهریور 1392, 12:33 عصر
از جوابتون ممنونم
من بالاخره با راهنمایی شما تونستم همونی را که در بالا هم ذکر کرده بودم بسازم.
با تشکر فراوان

helpsos
جمعه 15 شهریور 1392, 20:02 عصر
با سلام
ظاهراً به مشکلی برخوردم که نمی دونم چطوری حل میشه.

وقتی ما از چک باکس ها استفاده می کنیم وقتی که چند مورد را انتخاب می کنیم و البته دیتا گرید ما هم اسکرول خورده باشد . چک باکس ها قاطی پاتی می شوند البته اونهایی را که انتخاب کردیم مقدارشون را به صورت صحیح وارد لیست باکس می کنه ولی با انجام اسکرول چک باکس ها را قاطی میکنه.

حالا کسی راه حلی برای این کار داره؟

helpsos
پنج شنبه 21 شهریور 1392, 17:27 عصر
با سلام خدمت همه دوستان و مدیران

لطفا اگه کسی برای این مشکل راه حل داره یه کمکی بکنه.
من یه نمونه از برنامه را پیوست می کنم و اما مشکل :

وقتی چند نفر را انتخاب می کنیم و از اسکرول دیتاگرید استفاده می کنیم می بینیم که ردیف های زیری هم که ما انتخابشون نکردیم رو هم چک دار کرده حالا برنامه رو ببینید تا بهتر متوجه شید

با تشکر فراوان

helpsos
چهارشنبه 27 شهریور 1392, 23:52 عصر
با سلام
بالاخره مشکل حل شد.
البته با کمکهای دوست خوبمون mymina که جاداره از اینجا هم از ایشون کمال تشکر را نمایم.
فایل پیوست زیر نمونه کامل برنامه است که لازم دونستم به خاطر بازدید زیاد تاپیک اینجا ضمیمه نمایم.

با تشکر از دوست خوبم mymina:تشویق::تشویق::تشویق:

Omid Baluch Gharaei
سه شنبه 24 آذر 1394, 12:16 عصر
خیلی ممنون از helpsos عزیز.
مشکل منم حل شد