2016-02-05 4 views
5

Я хочу создать новый столбец, а затем добавить значения в только, что новый столбец на событие нажатия кнопки. Это возможно? Столбец может содержать несколько строк под ним, в зависимости от количества элементов в цитате.Добавление данных в определенный столбец в DataGrid

То, что я достиг до сих пор:

Мой класс, где вся моя информация хранится в

public class ViewQuoteItemList 
{ 
    ... 
    public double SupplierCost { get; set; } 
    ... 
} 

я могу создать свою колонку и привязать его к моему ViewQuoteItemList класса

DataGridTextColumn columnFeedbackSupplier = new DataGridTextColumn(); 
columnFeedbackSupplier.Binding = new Binding("SupplierCost"); 
//The header of the column gets it's value from a combobox where you select a company to be added to the datagrid 
columnFeedbackSupplier.Header = (cmbFeedbackSelectSupplier.SelectedItem as DisplayItems).Name; 

Отсюда я получаю свои элементы цитаты из другого datagrid, и я добавляю их в свой второй datagrid, где я хочу добавить новый столбец, и его значения

IList list = dgFeedbackAddCost.SelectedItems as IList; 
IEnumerable<ViewQuoteItemList> items = list.Cast<ViewQuoteItemList>(); 

var collection = (from i in items 
        let a = new ViewQuoteItemList { SupplierCost = 0 } 
        select a).ToList(); 

Наконец, я добавляю новый столбец на второй сетке и установить collection в качестве DataGrid-х ItemSource

dgFeedbackSelectSupplier.Columns.Add(columnFeedbackSupplier); 
dgFeedbackSelectSupplier.ItemsSource = collection; 

Моя проблема заключается в том, что когда я изменить ячейку данных от одного из поставщиков, вся строка обновляется с одним значением, потому что все привязано к одному источнику класса/элемента. Можно ли это исправить?

EDIT:

«Вся строка обновляется» означает, что каждый раз, когда я вставить значение в одну ячейку в строке, каждая отдельная клетка в этой строке обновляется с тем же значением. Вот несколько фотографий, показывающих, что я имею в виду. Я хочу редактировать все данные, и все это происходит на моем втором datagrid (dgFeedbackSupplier).

Здесь у меня есть две компании с четырьмя элементами, с которыми я хочу сравнить цены. Теперь я хочу щелкнуть по одной ячейке под компанией и добавить значение для определенного элемента.

enter image description here

Здесь я дважды щелкните на ячейке, чтобы изменить/изменить значение. enter image description here

Затем, когда я меняю свое значение в выбранной ячейке, значение каждой другой компании для этого конкретного элемента в той же строке обновляется с тем же значением. enter image description here

Это моя проблема, и мне нужно изменить только значение одной ячейки, а не всю строку.

EDIT 2:

Как я могу преобразовать это collection в ExpandoObject?

var collection = (from i in items 
        let a = new ViewQuoteItemList { Item = i.Item, Supplier = 25 } 
        select a).ToList(); 

EDIT 3:

Мой XAML:

<DataGrid x:Name="dgFeedbackSelectSupplier" Margin="245,266,0,32" BorderBrush="#FFADADAD" ColumnWidth="*" AutoGenerateColumns="True" CanUserAddRows="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn x:Name="columnFeedbackSupplierItem" IsReadOnly="True" Header="Item" Binding="{Binding Item}"/> 
    </DataGrid.Columns> 
</DataGrid> 

И это, как весь мой метод похож на тот момент, когда я добавить свои столбцы и где я получаю элементы из мои другие данные:

private void btnFeedbackSelectSupplier_Click(object sender, RoutedEventArgs e) 
    { 
     supplier.Id = (cmbFeedbackSelectSupplier.SelectedItem as DisplayItems).Id;//Not using yet 
     supplier.Name = (cmbFeedbackSelectSupplier.SelectedItem as DisplayItems).Name; 

     DataGridTextColumn columnFeedbackSupplier = new DataGridTextColumn(); 
     columnFeedbackSupplier.Binding = new Binding("Supplier") { Mode = BindingMode.TwoWay }; 
     columnFeedbackSupplier.CanUserReorder = true; 
     columnFeedbackSupplier.CanUserResize = true; 
     columnFeedbackSupplier.IsReadOnly = false; 

     columnFeedbackSupplier.Header = supplier.Name; 

     dgFeedbackAddCost.SelectAll(); 

     IList list = dgFeedbackAddCost.SelectedItems as IList; 
     IEnumerable<ViewQuoteItemList> items = list.Cast<ViewQuoteItemList>(); 

     var collection = new List<ExpandoObject>(); 
     foreach (var i in items) 
     { 
      dynamic a = new ExpandoObject(); 
      a.Id = (cmbFeedbackSelectSupplier.SelectedItem as DisplayItems).Id; 
      a.Item = i.Item; 
      a.Supplier = 25; 
      collection.Add(a); 
     } 

     dgFeedbackSelectSupplier.Columns.Add(columnFeedbackSupplier); 
     dgFeedbackSelectSupplier.ItemsSource = collection; 
    } 
+0

Извините, я не могу понять. Что означает «вся строка обновляется»? Какую ячейку вы редактируете, что порождает проблему? на каком datagrid? Вы добавляете или редактируете данные? Каково поведение вашей кнопки? Мне кажется, вам нужно отполировать вопрос – tede24

+0

@ tede24 Спасибо за комментарий человека. Я отредактировал свой вопрос, чтобы дать ему более подробную информацию, надеюсь, вы поймете, чего я пытаюсь добиться немного лучше. – CareTaker22

+0

ваши оба столбца связаны с тем же свойством класса ViewQuoteItemList? –

ответ

0

Я вижу, что этот вопрос становится немного внимательным, поэтому я отправлю решение на мой ответ. Я надеюсь, что это поможет кому-то, чтобы получить представление о том, как добавлять данные только к определенному столбцу.:)

Как примечание - это тестовое приложение, которое я создал, поэтому кодирование не будет таким же, как и в моем исходном вопросе. Также я использовал словарь для решения моей проблемы. Он отлично работает!

Создание мой Предмет и Поставщик списка:

//I create my dummy suppliers 
private string[] CONST_Supplies = { "Supplier 1", "Supplier 2", "Supplier 3", "Supplier 4" }; 
public MainWindow() 
{ 
    InitializeComponent(); 

    //I add my dummy items into my datagrid 
    //These are the items that I want to compare prices with 
    List<ViewQuoteItemList> list = new List<ViewQuoteItemList>(); 
    list.Add(new ViewQuoteItemList() { Item = "Item 1" }); 
    list.Add(new ViewQuoteItemList() { Item = "Item 2" }); 
    list.Add(new ViewQuoteItemList() { Item = "Item 3" }); 
    list.Add(new ViewQuoteItemList() { Item = "Item 4" }); 
    list.Add(new ViewQuoteItemList() { Item = "Item 5" }); 
    list.Add(new ViewQuoteItemList() { Item = "Item 6" }); 
    //Loading the items into the datagrid on application start 
    DataGridTest.ItemsSource = list; 

    //Adding my dummy suppliers to my supplier selection combobox 
    foreach (var supplier in CONST_Supplies) 
     ComboBoxTest.Items.Add(supplier); 
} 

Мое событие нажатия кнопки:

private void Add_Click(object sender, RoutedEventArgs e) 
{ 
    //Select my supplier from my Supplier's combobox 
    var supplier = ComboBoxTest.SelectedItem as string; 
    //Create the Supplier column and bind it to my 'ViewQuoteItemList' class + 
    //I'm binding it to the unique supplier selected from my combobox 
    DataGridTextColumn columnFeedbackSupplier = new DataGridTextColumn(); 
    columnFeedbackSupplier.Binding = new Binding("Suppliers[" + supplier + "]"); 
    columnFeedbackSupplier.Binding.FallbackValue = "Binding failed"; 
    columnFeedbackSupplier.CanUserReorder = true; 
    columnFeedbackSupplier.CanUserResize = true; 
    columnFeedbackSupplier.IsReadOnly = false; 
    columnFeedbackSupplier.Header = ComboBoxTest.SelectedItem as string; 

    foreach (var item in DataGridTest.ItemsSource as List<ViewQuoteItemList>) 
     if (!item.Suppliers.ContainsKey(supplier)) 
      item.Suppliers.Add(supplier, string.Empty); 

    DataGridTest.Columns.Add(columnFeedbackSupplier); 
} 

Мой класс:

public class ViewQuoteItemList 
{ 
    public ViewQuoteItemList() 
    { 
     Suppliers = new ObservableDictionary<string, string>(); 
    } 
    public int Id { get; set; } 
    public string Item { get; set; } 
    public ObservableDictionary<string, string> Suppliers { get; set; } 
} 

И мой Наблюдаемые словарь, где много работы происходит:

public class ObservableDictionary<TKey, TValue> : IDictionary<TKey, TValue>, INotifyCollectionChanged, INotifyPropertyChanged 
{ 
    private const string CountString = "Count"; 
    private const string IndexerName = "Item[]"; 
    private const string KeysName = "Keys"; 
    private const string ValuesName = "Values"; 

    private IDictionary<TKey, TValue> _Dictionary; 
    protected IDictionary<TKey, TValue> Dictionary 
    { 
     get { return _Dictionary; } 
    } 

    #region Constructors 
    public ObservableDictionary() 
    { 
     _Dictionary = new Dictionary<TKey, TValue>(); 
    } 
    public ObservableDictionary(IDictionary<TKey, TValue> dictionary) 
    { 
     _Dictionary = new Dictionary<TKey, TValue>(dictionary); 
    } 
    public ObservableDictionary(IEqualityComparer<TKey> comparer) 
    { 
     _Dictionary = new Dictionary<TKey, TValue>(comparer); 
    } 
    public ObservableDictionary(int capacity) 
    { 
     _Dictionary = new Dictionary<TKey, TValue>(capacity); 
    } 
    public ObservableDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer) 
    { 
     _Dictionary = new Dictionary<TKey, TValue>(dictionary, comparer); 
    } 
    public ObservableDictionary(int capacity, IEqualityComparer<TKey> comparer) 
    { 
     _Dictionary = new Dictionary<TKey, TValue>(capacity, comparer); 
    } 
    #endregion 

    #region IDictionary<TKey,TValue> Members 

    public void Add(TKey key, TValue value) 
    { 
     Insert(key, value, true); 
    } 

    public bool ContainsKey(TKey key) 
    { 
     return Dictionary.ContainsKey(key); 
    } 

    public ICollection<TKey> Keys 
    { 
     get { return Dictionary.Keys; } 
    } 

    public bool Remove(TKey key) 
    { 
     if (key == null) throw new ArgumentNullException("key"); 

     TValue value; 
     Dictionary.TryGetValue(key, out value); 
     var removed = Dictionary.Remove(key); 
     if (removed) 
      //OnCollectionChanged(NotifyCollectionChangedAction.Remove, new KeyValuePair<TKey, TValue>(key, value)); 
      OnCollectionChanged(); 

     return removed; 
    } 


    public bool TryGetValue(TKey key, out TValue value) 
    { 
     return Dictionary.TryGetValue(key, out value); 
    } 


    public ICollection<TValue> Values 
    { 
     get { return Dictionary.Values; } 
    } 


    public TValue this[TKey key] 
    { 
     get 
     { 
      return Dictionary[key]; 
     } 
     set 
     { 
      Insert(key, value, false); 
     } 
    } 


    #endregion 


    #region ICollection<KeyValuePair<TKey,TValue>> Members 


    public void Add(KeyValuePair<TKey, TValue> item) 
    { 
     Insert(item.Key, item.Value, true); 
    } 


    public void Clear() 
    { 
     if (Dictionary.Count > 0) 
     { 
      Dictionary.Clear(); 
      OnCollectionChanged(); 
     } 
    } 


    public bool Contains(KeyValuePair<TKey, TValue> item) 
    { 
     return Dictionary.Contains(item); 
    } 


    public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) 
    { 
     Dictionary.CopyTo(array, arrayIndex); 
    } 


    public int Count 
    { 
     get { return Dictionary.Count; } 
    } 


    public bool IsReadOnly 
    { 
     get { return Dictionary.IsReadOnly; } 
    } 


    public bool Remove(KeyValuePair<TKey, TValue> item) 
    { 
     return Remove(item.Key); 
    } 


    #endregion 


    #region IEnumerable<KeyValuePair<TKey,TValue>> Members 


    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() 
    { 
     return Dictionary.GetEnumerator(); 
    } 


    #endregion 


    #region IEnumerable Members 


    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return ((IEnumerable)Dictionary).GetEnumerator(); 
    } 


    #endregion 


    #region INotifyCollectionChanged Members 


    public event NotifyCollectionChangedEventHandler CollectionChanged; 


    #endregion 


    #region INotifyPropertyChanged Members 


    public event PropertyChangedEventHandler PropertyChanged; 


    #endregion 


    public void AddRange(IDictionary<TKey, TValue> items) 
    { 
     if (items == null) throw new ArgumentNullException("items"); 


     if (items.Count > 0) 
     { 
      if (Dictionary.Count > 0) 
      { 
       if (items.Keys.Any((k) => Dictionary.ContainsKey(k))) 
        throw new ArgumentException("An item with the same key has already been added."); 
       else 
        foreach (var item in items) Dictionary.Add(item); 
      } 
      else 
       _Dictionary = new Dictionary<TKey, TValue>(items); 


      OnCollectionChanged(NotifyCollectionChangedAction.Add, items.ToArray()); 
     } 
    } 


    private void Insert(TKey key, TValue value, bool add) 
    { 
     if (key == null) throw new ArgumentNullException("key"); 


     TValue item; 
     if (Dictionary.TryGetValue(key, out item)) 
     { 
      if (add) throw new ArgumentException("An item with the same key has already been added."); 
      if (Equals(item, value)) return; 
      Dictionary[key] = value; 


      OnCollectionChanged(NotifyCollectionChangedAction.Replace, new KeyValuePair<TKey, TValue>(key, value), new KeyValuePair<TKey, TValue>(key, item)); 
     } 
     else 
     { 
      Dictionary[key] = value; 

      OnCollectionChanged(NotifyCollectionChangedAction.Add, new KeyValuePair<TKey, TValue>(key, value)); 
     } 
    } 


    private void OnPropertyChanged() 
    { 
     OnPropertyChanged(CountString); 
     OnPropertyChanged(IndexerName); 
     OnPropertyChanged(KeysName); 
     OnPropertyChanged(ValuesName); 
    } 


    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 


    private void OnCollectionChanged() 
    { 
     OnPropertyChanged(); 
     if (CollectionChanged != null) CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); 
    } 


    private void OnCollectionChanged(NotifyCollectionChangedAction action, KeyValuePair<TKey, TValue> changedItem) 
    { 
     OnPropertyChanged(); 
     if (CollectionChanged != null) CollectionChanged(this, new NotifyCollectionChangedEventArgs(action, changedItem)); 
    } 


    private void OnCollectionChanged(NotifyCollectionChangedAction action, KeyValuePair<TKey, TValue> newItem, KeyValuePair<TKey, TValue> oldItem) 
    { 
     OnPropertyChanged(); 
     if (CollectionChanged != null) CollectionChanged(this, new NotifyCollectionChangedEventArgs(action, newItem, oldItem)); 
    } 


    private void OnCollectionChanged(NotifyCollectionChangedAction action, IList newItems) 
    { 
     OnPropertyChanged(); 
     if (CollectionChanged != null) CollectionChanged(this, new NotifyCollectionChangedEventArgs(action, newItems)); 
    } 
} 

Это много кода, я знаю. Извините, у меня нет времени, чтобы объяснить все и как это работает. Я надеюсь, что вы, ребята, можете понять это сами;) В классе также есть много дополнительных функций, которые вы можете использовать для различных целей.

Наконец, вот мой XAML:

<Button x:Name="Add" Content="Add" HorizontalAlignment="Left" Margin="65,143,0,0" VerticalAlignment="Top" Width="75" Click="Add_Click"/> 
<DataGrid x:Name="DataGridTest" CanUserAddRows="False" AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="165,115,0,0" VerticalAlignment="Top" Height="279" Width="611" ColumnWidth="*"> 
    <DataGrid.Columns> 
     <DataGridTextColumn x:Name="columnFeedbackSupplierItem" Header="Item" Binding="{Binding Item}"/> 
    </DataGrid.Columns> 
</DataGrid> 
<ComboBox x:Name="ComboBoxTest" HorizontalAlignment="Left" Margin="20,115,0,0" VerticalAlignment="Top" Width="120"/> 

Примечание - Значения в сетке могут быть отредактированы при двойном щелчке на ячейке. Спасибо всем людям, которые добавили мне свой вопрос или помогли мне в правильном направлении. Надеюсь, это поможет кому-то там.

0

Вы не можете использовать коллекцию для привязки со своей второй DataGrid, потому что ваше представление является динамическим, может иметь переменную no из столбцов.

Вы должны использовать DataTable в качестве источника для своего DataGrid. Вместо добавления столбца в сетке добавьте столбец в DataTable и AutoGenerate столбец в Grid.

Метод для преобразования источника элемента (любого типа) в DataTable есть (может быть вам нужен этот первый раз):

public static DataTable DataGridtoDataTable(DataGrid dg) 
    { 


     dg.SelectAllCells(); 
     dg.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader; 
     ApplicationCommands.Copy.Execute(null, dg); 
     dg.UnselectAllCells(); 
     String result = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue); 
     string[] Lines = result.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None); 
     string[] Fields; 
     Fields = Lines[0].Split(new char[] { ',' }); 
     int Cols = Fields.GetLength(0); 

     DataTable dt = new DataTable(); 
     for (int i = 0; i < Cols; i++) 
      dt.Columns.Add(Fields[i].ToUpper(), typeof(string)); 
     DataRow Row; 
     for (int i = 1; i < Lines.GetLength(0) - 1; i++) 
     { 
      Fields = Lines[i].Split(new char[] { ',' }); 
      Row = dt.NewRow(); 
      for (int f = 0; f < Cols; f++) 
      { 
       Row[f] = Fields[f]; 
      } 
      dt.Rows.Add(Row); 
     } 
     return dt; 

    } 

потом, когда нужно добавить столбец в DataGrid, добавить столбец в таблице, итерации на collection, чтобы заполнить ваш столбец в таблице данных.

Нет простого способа решить вашу проблему, поскольку ваш сценарий уникален, и только динамическая структура может полностью удовлетворить ваши потребности.

Поскольку с помощью DataTable вся ваша ячейка будет привязана к уникальным объектам. Только одна ячейка будет обновляться на одном изменении DataGrid ячейки. (В отличие от коллекции, где несколько ячеек связаны с тем же свойством)

+0

Спасибо за ответ человек! Я проинформирую вас о моем прогрессе, как только я получу немного;) – CareTaker22

+0

Глобальные данные буфера обмена изменяются во время этой операции. Лучше бы поместить текущие данные буфера обмена перед операцией и после этого вернуть их обратно в буфер обмена. –

0

Для вашего требования я хотел бы предложить вам использовать Microsoft DynamicsExpandoObject

Вам нужно создать List<ExpandoObject>, который является не чем иным, как Dictionary<string,object>, в котором ваш ключ - это ваше имя и объект, ваше значение. Итак, в вашем случае,

Все объекты в ViewQuoteItem добавлены в этот новый объект, и когда вам нужно добавить столбец, вы можете добавить другое свойство к своему объекту. Затем просто обновите свое представление и увидите новый столбец, добавленный в сетку.

Чтобы использовать EXPANDO, вы можете сделать это легкий путь -

var dynamicItem = New ExpandoObject(); 
dynamicItem.Item = "Test"; 
dynamicItem.BarlwoodCityDeep = (int)350; 

или вы можете рассматривать dynamicItem как словарь, как это -

IDictionary<String, Object> dynamicDict = dynamicItem 
dynamicDict.Add("MyNewProperty","MySomeValue") 

Я лично найти преобразования в Dict легко, как это дает мне возможность свободно добавлять свойства, а затем использовать ключи для ссылки на них, но это просто непринужденность, а не принуждение.

Я бы также рекомендовал вам использовать метод, который отображает ваш список данных в новый expandoList и связывает список расширений с вашим представлением, убедитесь, что вы используете AutoGeneration столбцов в WPF, чтобы новые столбцы были видны.

Вы можете взглянуть на мое решение here, которое сработало для меня в несколько похожем случае.

Если вы новичок в dynamics, это может показаться немного сложным, но Expandos относятся к работе и легкость в работе с ними потрясающая.


конвертировать из ViewQuoteItemList в EXPANDO -

var collection = new List<ExpandoObject>(); 

foreach (var i in items) 
      { 
       dynamic a = new ExpandoObject(); 
       a.Item = i.item; 
       a.Supplier = 25; 
       collection.Add(a); 
      } 

Связанные статьи here и еще один интересный один here

+0

Спасибо за ответ! Я дам вам знать, как только у меня все получится. – CareTaker22

+0

надеюсь, что это работает для u;) – Muds

+0

Это ExpandoObjects действительно круто (или то, что я узнал до сих пор), но одна вещь, с которой я борюсь, заключается в следующем: _ «Все свойства в ViewQuoteItem добавляются в этот новый объект «_. Как я могу установить свой 'ViewQuoteItemList' в' ExpandoObject'? 0_o – CareTaker22

0

Лично я бы держаться подальше от фактически инстанцировании отдельные столбцы, а добавьте их непосредственно в DataGridView, а затем обработайте их свойства.

List<MyClass> myList = new List<MyClass>(); 
BindingList<MyClass> bList = new BindingList<MyClass>(myList); 
myDataGridView.DataSource = new BindingSource(bList,null); 

//Now Lets add a custom column.. 
myDataGridView.Columns.Add("Text","Text"); 

//Now lets edit it's properties 
myDataGridView.Columns["Text"].ReadOnly = false; 
myDataGridView.EditMode = DataGridViewEditMode.EditOnKeystroke; 

//Now lets walk through and throw some data in each cell.. 
if(myDataGridView.Rows.Count > 1) 
{ 
    for(int i = 0;i < myDataGridView.Rows.Count;i++) 
    { 
      myDataGridView.Rows[i].Cells["Text"].Value = "My Super Useful Text"; 
    } 
} 

избежать использования инстанцирования колонки, а затем добавив, что помогло мне в прошлом с странными вопросами подъёмника, например редактированием одной ячейки, а другие меняют. Что касается подзапросов и т. Д., Я не могу сказать, что могу прокомментировать это.

3

Могу ли я предложить другой подход? Из того, что я понимаю;

У вас есть поставщики и поставщики имеют предметы. Вы можете добавить новых поставщиков. Я предположил, что у поставщиков может не быть всех предметов (для вызова :)).

Вы хотите представить эту структуру данных в виде сетки.

Проблема заключается в том, что вы пытаетесь отобразить нестандартные данные с компонентом табличного представления. У вас есть иерархические данные. Прежде чем я продолжу свое решение, сделайте несколько снимков экрана.

enter image description here

enter image description here

enter image description here

То, что я в основном делали здесь, чтобы создать новые взгляды на иерархических данных, заполняя пробелы и превратить его в табличной форме. Я использовал поддельные классы для пустых слотов, поэтому я мог легко выбрать подходящие дата-шаблоны в XAML. Я избегал использовать какой-либо пользовательский код и сохранял все в MVVM + XAML. Так что привязки и такие работы, как ожидалось.

Новые представления должны были обновляться при изменении коллекций, поэтому я использовал класс Messenger из MVVMLight для легкой реализации и вызывал события RaisePropertyChanged вручную.

В XAML я использовал элементы ItemsControl и UniformGrid для создания вида сетки.

Я поставил законченное решение на GitHub: https://github.com/orhtun/GridLikeViewWithDynamicColumns

Это создает случайные данные о каждом запуске. Если вы получаете ошибки сборки, попробуйте щелкнуть правой кнопкой мыши по решению и Восстановить пакеты NuGet.

+0

Привет, человек! И спасибо за ваш ответ. Это как-то слишком поздно. Я выяснил, как это сделать в моем datagrid. Я отправлю ответ позже сегодня, когда я получу шанс! Еще раз спасибо за все ваши усилия. :) – CareTaker22

+0

Не проблема, это был интересный вопрос. Возможно, это понадобилось бы самому себе в будущем :) –

+0

Sweet man! Я отправил ответ, где я покажу свое кодирование и как я решил эту загадку. Надеюсь, это поможет вам в будущем. – CareTaker22

Смежные вопросы