Страницы

Поиск по вопросам

Показаны сообщения с ярлыком datagrid. Показать все сообщения
Показаны сообщения с ярлыком datagrid. Показать все сообщения

среда, 18 марта 2020 г.

Как “выдернуть” значение из ячейки DataGridView?

#c_sharp #datagrid #winforms


Добрый день!Создал Форму1,добавил DataGridView и кинул событие для Формы1:
private void Form1_Load(object sender, EventArgs e)
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_VideoController");
        foreach (ManagementObject queryObj in searcher.Get())
        {
            dataGridView1.Rows.Add(queryObj["Caption"].ToString(), queryObj["PNPDeviceID"].ToString());
        }
    }

Далее для button'a в третьей колонки и кинул событие:
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        string url = "http://сайт.ru" + //тут значение из второй колонки// ;
        Process.Start(url);
        Close();
    }

В итоге вышла таблица,где выходит Имя и Значение ("Caption" и "PNPDeviceID"),а в
третьей колонке по нажатию на button идет переход на сайт.
Вопрос...как выдернуть значение "PNPDeviceID" из второй колонки и подставить в код
где написано "//тут значение из второй колонки//"...т.е. чтобы по нажатию на button
был переход на сайт с учетом значения во второй колонке "PNPDeviceID"?
Надеюсь понятно поставил вопрос.
Заранее спасибо.     


Ответы

Ответ 1



dataGridView1.Rows[e.RowIndex].Cells[1].Value

Ответ 2



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

Ответ 3



CompanyGridView["CompanyID", e.RowIndex].Value; теперь куда бы ты не перемещал столбец, всегда получишь его значение, CompanyID - имя столбца в CompanyGridView

пятница, 6 марта 2020 г.

WPF, DataGrid. Растягивание колонок при появлении свободного места

#c_sharp #wpf #xaml #datagrid


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




Вид при нехватке места:


Вид при избытке места:

    


Ответы

Ответ 1



Установите свойство ColumnWidth в *. Это приведет к равномерному растягиванию всех столбцов таблицы. Также в сочетании с этим свойством можете установить каким-то столбцам свою ширину. столбцы 2 и 3 поделят между собой всю свободную ширину, тем самым не будет видно "пустого столбца". UDP: Если таблица имеет фиксированную ширину то, для появления горизонтального скрола, можно сделать так:

воскресенье, 1 марта 2020 г.

Как убрать первую колонку в DataGrid?

#wpf #datagrid



    
        
            
                
            
        
    

    
        
    

    
        
    



Проблема в том, что в начале появляется неясная колонка (см. скрин ниже). 


Кто то знает как ее убрать?
    


Ответы

Ответ 1



Это не первая колонка (столбец) а заголовок для строки. Его можно убрать с помощью установки в 0 свойства RowHeaderWidth Альтернативный вариант подсказанный Андрей NOP - установить пустой шаблон:

пятница, 14 февраля 2020 г.

Изменение цвета столбца для выделенной ячейки Datagrid WPF

#c_sharp #wpf #datagrid


Доброе время суток, как изменить цвет столбца выделенной ячейки в datagrid WPF
    


Ответы

Ответ 1



Можно сделать так, поместите в ресурсы стиль для выделенной ячейки и подпишитесь на CurrentCellChanged: В подписчике просто применим стиль к текущему столбцу: DataGridColumn CurrentColumn = null; private void DataGrid_CurrentCellChanged(object sender, EventArgs e) { var dataGrid = (DataGrid)sender; if (CurrentColumn != null) CurrentColumn.CellStyle = null; CurrentColumn = dataGrid.CurrentColumn; if (CurrentColumn != null) CurrentColumn.CellStyle = (Style)dataGrid.Resources["SelectedColumnStyle"]; }

четверг, 13 февраля 2020 г.

WPF. Нужно колонку заполнить ссылками

#c_sharp #wpf #xaml #binding #datagrid


Имеется источник данных и DataGrid. Нужно заполнить последнюю колонку ссылками, ссылки
будут однотипные примера somesite.ru/user?id=ID, где id берестся из ItemSource. Все
никак с Binding разобраться не могу.


        
            
            
            
            
            
            
                
                    
                        
                            
                        
                    
                
            
        
        
            

            
        
    

    


Ответы

Ответ 1



А что сложного? Создаёте конвертер: class UriConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var id = (string)value; return new Uri("http://somesite.ru/user?id=" + id); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotSupportedException(); } } Затем, положите его в ресурсы вашего окна: И используйте для конвертации: Подписка на RequestNavigate нужна для того, чтобы работали ссылки. void OnRequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e) { var uri = e.Uri.AbsoluteUri; Task.Run(() => Process.Start(uri)); e.Handled = true; } Вроде бы всё, должно работать.

Ответ 2



А еще проще через форматирование вот как выглядит биндинг {Binding YourProperty, StringFormat='somesite.ru/user?id={0}'} Ну а в вашем случае просто {Binding StringFormat='somesite.ru/user?id={0}'} Короче все то же самое, что написал VladD, только без конвертера

среда, 5 февраля 2020 г.

Изменяя значение DataGrid в другом потоке

#c_sharp #wpf #многопоточность #datagrid


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

RobotsInfo ri = (RobotsInfo)dataGrid.Items[0];
ri.Name = "AAA";


Данный код в основном потоке изменяет значение в таблице на AAA, а если сделать тоже
самое в другом потоке, то ничего не получается. Как можно решить это?
    


Ответы

Ответ 1



Попросите Dispatcher выполнить эти действия в "правильном" потоке: dataGrid.Dispatcher.Invoke(() => { RobotsInfo ri = (RobotsInfo)dataGrid.Items[0]; ri.Name = "AAA"; });

Ответ 2



В .NET Доступ к UI потоку ограничен в целях безопасности. Поэтому нужно использовать диспетчер. Ниже приведён пример, как можно выполнить операции с UI в требуемом потоке. // Создаём и запускаем поток. private void Button_Click(object sender, RoutedEventArgs e) { Thread thread = new Thread(UpdateTextWrong); thread.Start(); } // Метод, который будет выполняться в потокею private void UpdateTextWrong() { this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate() { // Делаем что-то в UI-потоке. } ); }

воскресенье, 26 января 2020 г.

WPF - Постраничная передача и отображение данных в приложение с DataGrid

#c_sharp #net #wpf #datagrid #silverlight


Имеется приложение, в котором для вывода данных используется DataGrid. Сейчас эти
данные загружаются в DataGrid из коллекции типа ObservableCollection, причём к DataGrid
добавил возможность постраничной навигации, для чего использовал PagedCollectionView
из Silverlight. Всё вроде как отлично работает. Теперь меня интересует, есть ли какие-то
встроенные средства добавить возможность не просто постраничного отображения, но и
также постраничной передачи данных в DataGrid (вернее даже не в DataGrid, а в CollectionView,
ассоциированному с этим DataGrid'ом)? Это было бы полезно в случае клиент-серверного
приложения, когда на стороне клиента будет лишь та порция данных, которая в данный
момент и отображается.

Спрашиваю про встроенные средства, т.к. в Silverlight постраничный DataGrid включён
в стандартную библиотеку. Учитывая, что Silverlight ориентирован на Веб, логично предположить,
что оный DataGrid как-то приспособлен для постепенной загрузки данных. Или это не так?
(С Silverlight не работал, так что его устройство не знаю.)


  Не уверен, что корректно сформулировал вопрос, так что если это так - поправьте
меня, пожалуйста.

    


Ответы

Ответ 1



Воспользуйтесь этим примером: using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Windows; using System.Windows.Data; namespace GridPagingExample { public partial class MainWindow : Window { private readonly PagingCollectionView _cview; public MainWindow() { InitializeComponent(); this._cview = new PagingCollectionView( new List { new { Animal = "Lion", Eats = "Tiger" }, new { Animal = "Tiger", Eats = "Bear" }, new { Animal = "Bear", Eats = "Oh my" }, new { Animal = "Wait", Eats = "Oh my isn't an animal" }, new { Animal = "Oh well", Eats = "Who is counting anyway" }, new { Animal = "Need better content", Eats = "For posting on stackoverflow" } }, 2 ); this.DataContext = this._cview; } private void OnNextClicked(object sender, RoutedEventArgs e) { this._cview.MoveToNextPage(); } private void OnPreviousClicked(object sender, RoutedEventArgs e) { this._cview.MoveToPreviousPage(); } } public class PagingCollectionView : CollectionView { private readonly IList _innerList; private readonly int _itemsPerPage; private int _currentPage = 1; public PagingCollectionView(IList innerList, int itemsPerPage) : base(innerList) { this._innerList = innerList; this._itemsPerPage = itemsPerPage; } public override int Count { get { if (this._currentPage < this.PageCount) // page 1..n-1 { return this._itemsPerPage; } else // page n { var itemsLeft = this._innerList.Count % this._itemsPerPage; if (0 == itemsLeft) { return this._itemsPerPage; // exactly itemsPerPage left } else { // return the remaining items return itemsLeft; } } } } public int CurrentPage { get { return this._currentPage; } set { this._currentPage = value; this.OnPropertyChanged(new PropertyChangedEventArgs("CurrentPage")); } } public int ItemsPerPage { get { return this._itemsPerPage; } } public int PageCount { get { return (this._innerList.Count + this._itemsPerPage - 1) / this._itemsPerPage; } } private int EndIndex { get { var end = this._currentPage * this._itemsPerPage - 1; return (end > this._innerList.Count) ? this._innerList.Count : end; } } private int StartIndex { get { return (this._currentPage - 1) * this._itemsPerPage; } } public override object GetItemAt(int index) { var offset = index % (this._itemsPerPage); return this._innerList[this.StartIndex + offset]; } public void MoveToNextPage() { if (this._currentPage < this.PageCount) { this.CurrentPage += 1; } this.Refresh(); } public void MoveToPreviousPage() { if (this._currentPage > 1) { this.CurrentPage -= 1; } this.Refresh(); } } } Хамл: