سلام
دوستان من یک کنترل گرید با کد زیر در فرم wpf دارم
<telerik:RadGridView x:Name="RadGrid" IsReadOnly="True" FlowDirection ="RightToLeft"
CanUserFreezeColumns="False" CanUserResizeColumns="False"
ShowGroupPanel ="False" AutoGenerateColumns ="False" Margin="0,0,0,-29" telerik:StyleManager.Theme="Office_Blue" Cursor="Hand" CanUserInsertRows="False" CanUserDeleteRows="False" Grid.ColumnSpan="2" Grid.RowSpan="4" SelectionChanged="RadGrid_SelectionChanged" >
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding SchoolID}"
Header="کد" MaxWidth ="50" MinWidth ="50" TextAlignment="Right" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding SchoolTitle}"
Header="عنوان مدرسه" MaxWidth ="200" MinWidth ="100" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding SchoolPhone}"
Header="تلفن" MaxWidth ="100" MinWidth ="100" />
<telerik:GridViewColumn Header="دستورات" IsFilterable="False" >
<telerik:GridViewColumn.CellTemplate>
<DataTemplate>
<Button x:Name="btnDelete" Width="50" Height="22" Content="حذف" Click="DeleteData" ></Button>
</DataTemplate>
</telerik:GridViewColumn.CellTemplate>
</telerik:GridViewColumn>
<telerik:GridViewDataColumn
UniqueName="SchoolID" FooterTextAlignment="Left" IsReorderable="False" IsVisible="False" IsFilterable="False" DataMemberBinding="{Binding SchoolID}">
</telerik:GridViewDataColumn>
</telerik:RadGridView.Columns>
</telerik:RadGridView>
و در Codebehind :
private void RadGrid_SelectionChanged(object sender, SelectionChangeEventArgs e)
{
SchoolID = this.RadGrid.SelectedItems.OfType<Schools>().Select(i => i.SchoolID).FirstOrDefault();
}
ولی فقط زمانی که یک رکورد مارک می شود کد برنامه درست عمل میکند.
مثلا اگر رکورد شماره 10 در گرید select شده باشد و من روی دکمه حذف رکورد شماره 4 کلیک کنم رکورد شماره 10 حذف میشود.
چطور شماره رکورد کلیک شده توسط موس را بدست بیاورم؟
چون شما از رویداد SelectionChanged استفاده کردید برای همین زمانی که یک ردیف را انتخاب میکنید مقدار SchoolID شما پر میشود . برای اینکه هر دکمه در هر ردیف بتواند رکورد جداگانه خود را حدف کند می توانید از Command ها استفاده کنید و مقدار ID را به parameter آن دکمه اختصاص دهید . به مثال زیر توجه کنید :
در بالای صفحه یک Command تعریف میکنیم :
<Window.CommandBindings> <CommandBinding Command="Delete" Executed="CommandBinding_OnExecuted"></CommandBinding> </Window.CommandBindings>
Command تعریف شده را به دکمه مورد نظر وصل میکنیم (نام Command ما Delete است) و SchoolID را به عنوان CommandParameter پاس میدهیم :
<telerik:GridViewColumn Header="دستورات" IsFilterable="False" > <telerik:GridViewColumn.CellTemplate> <DataTemplate> <Button x:Name="btnDelete" Width="50" Height="22" Content="حذف" Command="Delete" CommandParameter="{Binding Path=SchoolID}" ></Button> </DataTemplate> </telerik:GridViewColumn.CellTemplate> </telerik:GridViewColumn>
حال در Code رویداد Exacute را مینویسیم :
private void CommandBinding_OnExecuted(object sender, ExecutedRoutedEventArgs e) { MessageBox.Show(e.Parameter.ToString()); }
بسیار ممنونم
حالا اگه بخوام همزمان دکمه های ادیت و حذف را با هم داشته باشم ارور میده
ممنون میشم در اون مورد هم راهنمایی کنید
ممنونم
<telerik:GridViewColumn Header=
"دستورات"
IsFilterable=
"False"
>
<telerik:GridViewColumn.CellTemplate>
<DataTemplate>
</telerik:GridViewColumn.CellTemplate>
</telerik:GridViewColumn>
<DataTemplate> <Button x:Name="btnDelete" Width="50" Height="22" Content="حذف" Command="Delete" CommandParameter="{Binding Path=SchoolID}" ></Button> <Button x:Name="btnEdit" Width="50" Height="22" Content="ویرایش" Command="Edit" CommandParameter="{Binding Path=SchoolID}" ></Button> </DataTemplate>
شما باید برای Command Edit هم یک CommandBinding ثبت کنید که OnExacute جداگانه داشته باشد :
<Window.CommandBindings> <CommandBinding Command="Delete" Executed="CommandBinding_OnExecuted"></CommandBinding> <CommandBinding Command="Edit" Executed="EditCommandBinding_OnExecuted"></CommandBinding> </Window.CommandBindings>
سلام
ممنونم
انجام دادم
کد داخل گرید این شد:
<DataTemplate> <Button x:Name="btnDelete" Width="50" Height="22" Content="حذف" Command="Delete" CommandParameter="{Binding Path=SchoolID}" Tag ="{Binding SchoolID}" Click ="CommandBinding_OnExecuted" ></Button> <Button x:Name="btnEdit" Width="50" Height="22" Content="ویرایش" Command="Edit" CommandParameter="{Binding Path=SchoolID}" Tag ="{Binding SchoolID}" Click ="EditCommandBinding_OnExecuted" ></Button> </DataTemplate>
و کد بالای صفحه:
<Window.CommandBindings>
<CommandBinding Command="Delete" Executed="CommandBinding_OnExecuted"></CommandBinding>
<CommandBinding Command="Edit" Executed="EditCommandBinding_OnExecuted"></CommandBinding>
</Window.CommandBindings>
اما 4 تا ارور داده که سر در نمیارم:
Severity Code Description Project File Line
Error Invalid value for property 'Command': 'Microsoft.VisualStudio.DesignTools.Xaml.LanguageService.Semantics.XmlValue' SSMS D:\Projet\SSMS\SSMS\Windows\WinSchools.xaml 13
Severity Code Description Project File Line
Error The object 'DataTemplate' already has a child and cannot add 'Button'. 'DataTemplate' can accept only one child. Line 109 Position 227. SSMS D:\Projet\SSMS\SSMS\Windows\WinSchools.xaml 109
Severity Code Description Project File Line
Error The property "VisualTree" can only be set once. SSMS D:\Projet\SSMS\SSMS\Windows\WinSchools.xaml 107
Severity Code Description Project File Line
Error The property 'VisualTree' is set more than once. SSMS D:\Projet\SSMS\SSMS\Windows\WinSchools.xaml 109
علتش چیه به نظر شما؟
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)