using CustomComponents.GridView; using CustomComponents; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Telerik.WinControls; using Telerik.WinControls.UI; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace ANBAR.FORMS { public partial class Test3 : Telerik.WinControls.UI.RadForm { private RadGridView radGridView1; public Test3() { InitializeComponent(); SetupGrid(); LoadSampleData(); SetupGridWithEvents(); } private void SetupGrid() { // Initialize RadGridView radGridView1 = new RadGridView(); radGridView1.Dock = DockStyle.Fill; radGridView1.ThemeName = "Fluent"; // Enable editing radGridView1.AllowAddNewRow = true; radGridView1.AllowEditRow = true; radGridView1.BeginEditMode = RadGridViewBeginEditMode.BeginEditOnEnter; this.Controls.Add(radGridView1); } private void LoadSampleData() { // Sample data for main grid var mainData = new List { new MainRecord { Id = 1, Name = "رکورد اول", CategoryId = 1, StatusId = 1 }, new MainRecord { Id = 2, Name = "رکورد دوم", CategoryId = 2, StatusId = 2 }, new MainRecord { Id = 3, Name = "رکورد سوم", CategoryId = 1, StatusId = 3 } }; // Sample data for combo dropdowns var categories = new List { new CCategory { Id = 1, Name = "دسته‌بندی اول", Code = "CAT001", Description = "توضیحات دسته اول" }, new CCategory { Id = 2, Name = "دسته‌بندی دوم", Code = "CAT002", Description = "توضیحات دسته دوم" }, new CCategory { Id = 3, Name = "دسته‌بندی سوم", Code = "CAT003", Description = "توضیحات دسته سوم" } }; var statuses = new List { new Status { Id = 1, Title = "فعال", Color = "سبز", Priority = 1 }, new Status { Id = 2, Title = "غیرفعال", Color = "قرمز", Priority = 2 }, new Status { Id = 3, Title = "در انتظار", Color = "زرد", Priority = 3 } }; // Set main data source radGridView1.DataSource = mainData; // Configure columns ConfigureGridColumns(categories, statuses); } private void ConfigureGridColumns(List categories, List statuses) { // Clear auto-generated columns radGridView1.AutoGenerateColumns = false; radGridView1.Columns.Clear(); // Add regular columns radGridView1.Columns.Add(new GridViewTextBoxColumn("Id") { HeaderText = "شناسه", Width = 80, ReadOnly = true }); radGridView1.Columns.Add(new GridViewTextBoxColumn("Name") { HeaderText = "نام", Width = 200 }); // Add Category dropdown column var categoryColumn = new AdvancedComboGridViewColumn("CategoryId") { HeaderText = "دسته‌بندی", Width = 250, DataSource = categories, DisplayMember = "Name", ValueMember = "Id" }; // Configure category column display categoryColumn.ColumnsConfig.AddRange(new[] { new AdvancedRadMultiColumnComboPlus.ColumnConfig { Name = "Code", HeaderText = "کد", Width = 80, HeaderAlignment = ContentAlignment.MiddleCenter, TextAlignment = ContentAlignment.MiddleCenter }, new AdvancedRadMultiColumnComboPlus.ColumnConfig { Name = "Name", HeaderText = "نام دسته‌بندی", Width = 150, HeaderAlignment = ContentAlignment.MiddleRight, TextAlignment = ContentAlignment.MiddleRight }, new AdvancedRadMultiColumnComboPlus.ColumnConfig { Name = "Description", HeaderText = "توضیحات", Width = 200, HeaderAlignment = ContentAlignment.MiddleRight, TextAlignment = ContentAlignment.MiddleRight } }); // Styling for category column categoryColumn.ItemFont = new Font("Tahoma", 9); categoryColumn.ItemRowHeight = 35; categoryColumn.DropDownHeight = 250; radGridView1.Columns.Add(categoryColumn); // Add Status dropdown column var statusColumn = new AdvancedComboGridViewColumn("StatusId") { HeaderText = "وضعیت", Width = 200, DataSource = statuses, DisplayMember = "Title", ValueMember = "Id" }; // Configure status column display statusColumn.ColumnsConfig.AddRange(new[] { new AdvancedRadMultiColumnComboPlus.ColumnConfig { Name = "Title", HeaderText = "عنوان", Width = 100, HeaderAlignment = ContentAlignment.MiddleRight, TextAlignment = ContentAlignment.MiddleRight }, new AdvancedRadMultiColumnComboPlus.ColumnConfig { Name = "Color", HeaderText = "رنگ", Width = 80, HeaderAlignment = ContentAlignment.MiddleCenter, TextAlignment = ContentAlignment.MiddleCenter }, new AdvancedRadMultiColumnComboPlus.ColumnConfig { Name = "Priority", HeaderText = "اولویت", Width = 70, HeaderAlignment = ContentAlignment.MiddleCenter, TextAlignment = ContentAlignment.MiddleCenter } }); // Custom styling for status column statusColumn.ItemFont = new Font("Tahoma", 9, FontStyle.Bold); statusColumn.ItemForeColor = Color.DarkBlue; statusColumn.ItemRowHeight = 30; statusColumn.DropDownHeight = 200; radGridView1.Columns.Add(statusColumn); // Set RTL and final configurations radGridView1.RightToLeft = RightToLeft.Yes; radGridView1.EnableSorting = true; radGridView1.EnableFiltering = true; } // Alternative method: Using events for more control private void SetupGridWithEvents() { // If you need more control over cell editing, you can use events radGridView1.CellBeginEdit += RadGridView1_CellBeginEdit; radGridView1.CellEndEdit += RadGridView1_CellEndEdit; radGridView1.CellValueChanged += RadGridView1_CellValueChanged; } private void RadGridView1_CellBeginEdit(object sender, GridViewCellCancelEventArgs e) { // Custom logic before editing begins if (e.Column is AdvancedComboGridViewColumn comboColumn) { // You can modify combo properties here based on current row data Console.WriteLine($"Starting edit on combo column: {comboColumn.HeaderText}"); } } private void RadGridView1_CellEndEdit(object sender, GridViewCellEventArgs e) { // Custom logic after editing ends if (e.Column is AdvancedComboGridViewColumn) { Console.WriteLine($"Finished editing combo column, new value: {e.Value}"); } } private void RadGridView1_CellValueChanged(object sender, GridViewCellEventArgs e) { // Handle value changes if (e.Column.Name == "CategoryId") { // Update related data based on category selection UpdateRelatedData(e.Row, e.Value); } } private void UpdateRelatedData(GridViewRowInfo row, object newCategoryId) { // Example: Update other columns based on category selection // This shows the power of integration with your existing grid logic } // Method to programmatically set combo values public void SetComboValue(int rowIndex, string columnName, object value) { if (rowIndex < radGridView1.Rows.Count) { var row = radGridView1.Rows[rowIndex]; var cell = row.Cells[columnName]; if (cell != null) { cell.Value = value; } } } // Method to get combo display text public string GetComboDisplayText(int rowIndex, string columnName) { if (rowIndex < radGridView1.Rows.Count) { var row = radGridView1.Rows[rowIndex]; var cell = row.Cells[columnName]; if (cell?.ColumnInfo is AdvancedComboGridViewColumn comboColumn) { // Get display text for the current value return GetDisplayTextForValue(cell.Value, comboColumn); } } return string.Empty; } private string GetDisplayTextForValue(object value, AdvancedComboGridViewColumn column) { if (value == null || column.DataSource == null) return string.Empty; try { if (column.DataSource is System.Collections.IEnumerable enumerable) { foreach (var item in enumerable) { var itemValue = item.GetType().GetProperty(column.ValueMember)?.GetValue(item); if (Equals(itemValue, value)) { var displayValue = item.GetType().GetProperty(column.DisplayMember)?.GetValue(item); return displayValue?.ToString() ?? string.Empty; } } } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"GetDisplayTextForValue failed: {ex.Message}"); } return value?.ToString() ?? string.Empty; } } public class MainRecord { public int Id { get; set; } public string Name { get; set; } public int CategoryId { get; set; } public int StatusId { get; set; } } public class CCategory { public int Id { get; set; } public string Name { get; set; } public string Code { get; set; } public string Description { get; set; } } public class Status { public int Id { get; set; } public string Title { get; set; } public string Color { get; set; } public int Priority { get; set; } } /* خلاصه راه‌حل برای ادغام کامپوننت AdvancedRadMultiColumnComboPlus با RadGridView، من سه کلاس اصلی ایجاد کردم: 1. AdvancedComboGridCellElement مسئول نمایش و ویرایش سلول مدیریت وضعیت‌های Edit/Display پردازش رویدادهای کیبورد و ماوس 2. AdvancedComboGridViewColumn ستون سفارشی برای RadGridView شامل تمام تنظیمات کامپوننت شما قابلیت تنظیم از طریق Property Grid در Designer 3. AdvancedComboGridViewEditor (اختیاری) ویرایشگر سفارشی برای کنترل بیشتر مزایای این راه‌حل: ✅ حفظ تمام قابلیت‌های کامپوننت اصلی MultiColumn display Search و Filtering Custom styling Keyboard navigation ✅ ادغام کامل با RadGridView پشتیبانی از تمام رویدادهای Grid سازگاری با Data Binding عملکرد بهینه ✅ قابلیت استفاده در Designer تنظیم خصوصیات از طریق Property Grid پشتیبانی از Serialization نحوه استفاده: // اضافه کردن ستون کامبو var comboColumn = new AdvancedComboGridViewColumn("CategoryId") { HeaderText = "دسته‌بندی", DataSource = categories, DisplayMember = "Name", ValueMember = "Id" }; radGridView1.Columns.Add(comboColumn); */ }