Как вы, наверное, знаете, Xdebug отказался от поддержки профилирования памяти с версии 2. *. Пожалуйста, найдите здесь строку «удаленные функции»: http://www.xdebug.org/updates.php
Удаленные функции
blockquote>
Итак, я попробовал другой инструмент, и он работал хорошо для меня.
https: //github.com/arnaud-lb/php-memory-profiler
Это то, что я сделал на моем сервере Ubuntu, чтобы включить его:
sudo apt-get install libjudy-dev libjudydebian1 sudo pecl install memprof echo "extension=memprof.so" > /etc/php5/mods-available/memprof.ini sudo php5enmod memprof service apache2 restart
И затем в моем коде:
Наконец откройте файл
callgrind.out
с помощью KCachegrindИспользование Google gperftools (рекомендуется!) [/ G8 ]
Прежде всего установите ggftools Google, загрузив последний пакет здесь: https://code.google.com/p/gperftools/
Затем, как всегда:
sudo apt-get update sudo apt-get install libunwind-dev -y ./configure make make install
Теперь в вашем коде:
memprof_enable(); // do your magic memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));
Затем откройте терминал и запустите:
pprof --web /tmp/profile.heap
pprof создаст новое окно в существующем сеансе браузера, как показано ниже:
[/g11]
Xhp rof + Xhgui (лучшее, на мой взгляд, для профилирования как процессора, так и памяти).
С Xhprof и Xhgui вы можете также профилировать использование процессора или просто использование памяти, если это ваша проблема на данный момент. Это очень полные решения, они дают вам полный контроль, и журналы могут быть записаны как на mongo, так и в файловой системе.
Подробнее см. Мой ответ здесь .
Blackfire
Blackfire - это профилировщик PHP SensioLabs, ребята Symfony2 https://blackfire.io/
Если вы используете puphpet , чтобы настроить свою виртуальную машину, вы будете рады узнать, что она поддерживается; -)
Дайте этим двум простым методам попробовать («1» в верхнем методе - это индекс столбца со списком)
Строка, в которую вы будете вносить изменения, будет линией установщика cel.Value =
, как вы можете изменить его на то, что вам нравится.
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dataGridView1.CurrentCell.ColumnIndex == 1 && e.Control is ComboBox)
{
ComboBox comboBox = e.Control as ComboBox;
comboBox.SelectedIndexChanged -= LastColumnComboSelectionChanged;
comboBox.SelectedIndexChanged += LastColumnComboSelectionChanged;
}
}
private void LastColumnComboSelectionChanged(object sender, EventArgs e)
{
var currentcell = dataGridView1.CurrentCellAddress;
var sendingCB = sender as DataGridViewComboBoxEditingControl;
DataGridViewTextBoxCell cel = (DataGridViewTextBoxCell)dataGridView1.Rows[currentcell.Y].Cells[0];
cel.Value = sendingCB.EditingControlFormattedValue.ToString();
}
<час>
Этот ответ витает в нескольких местах. Использование DataGridViewEditingControlShowingEventHandler вызовет больше событий, чем вы намереваетесь. В моем тестировании это вызвало событие несколько раз. Также использование события combo.SelectedIndexChanged - = на самом деле не удалит событие, а просто продолжит укладку. Во всяком случае, я нашел решение, которое, кажется, работает. Я включаю пример кода ниже:
// Add the events to listen for
dataGridView1.CellValueChanged +=
new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
dataGridView1.CurrentCellDirtyStateChanged +=
new EventHandler(dataGridView1_CurrentCellDirtyStateChanged);
// This event handler manually raises the CellValueChanged event
// by calling the CommitEdit method.
void dataGridView1_CurrentCellDirtyStateChanged(object sender,
EventArgs e)
{
if (dataGridView1.IsCurrentCellDirty)
{
// This fires the cell value changed handler below
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
// My combobox column is the second one so I hard coded a 1, flavor to taste
DataGridViewComboBoxCell cb = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[1];
if (cb.Value != null)
{
// do stuff
dataGridView1.Invalidate();
}
}
Эта ссылка верна. Обработайте EditingControlShowing event
DataGridView. В этом обработчике событий проверьте, интересует ли текущий столбец. И затем создайте временный комбинированный объект: -
ComboBox comboBox = e.Control as ComboBox;
MSDN имеет образец: см. В разделе примера здесь . Обратите внимание на Inheritance Hierarchy
& amp; Class Syntax
в ссылке msdn: -
открытый класс DataGridViewComboBoxEditingControl: ComboBox , IDataGridViewEditingControl
private DataGridView dataGridView1 = new DataGridView();
private void AddColorColumn()
{
DataGridViewComboBoxColumn comboBoxColumn =
new DataGridViewComboBoxColumn();
comboBoxColumn.Items.AddRange(
Color.Red, Color.Yellow, Color.Green, Color.Blue);
comboBoxColumn.ValueType = typeof(Color);
dataGridView1.Columns.Add(comboBoxColumn);
dataGridView1.EditingControlShowing +=
new DataGridViewEditingControlShowingEventHandler(
dataGridView1_EditingControlShowing);
}
private void dataGridView1_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e)
{
ComboBox combo = e.Control as ComboBox;
if (combo != null)
{
// Remove an existing event-handler, if present, to avoid
// adding multiple handlers when the editing control is reused.
combo.SelectedIndexChanged -=
new EventHandler(ComboBox_SelectedIndexChanged);
// Add the event handler.
combo.SelectedIndexChanged +=
new EventHandler(ComboBox_SelectedIndexChanged);
}
}
private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
((ComboBox)sender).BackColor = (Color)((ComboBox)sender).SelectedItem;
}