Как установить ColumnIndex недавно добавленного столбца DataGridViewButton - PullRequest
0 голосов
/ 28 ноября 2009

У меня действительно раздражающая проблема с ячейкой кнопки в элементе управления DataGridView. Я связываю сетку с набором данных во время выполнения. Некоторые строки в сетке будут связаны с PDF-документами. Я создаю столбец кнопки и добавляю его в сетку, затем перебираю строки и на основе значения определенного столбца устанавливаю текст ячейки в столбце кнопки. Когда я шагаю по коду, я вижу, что ColumnIndex столбца кнопки равен 10. Однако когда форма появляется, значения кнопки для нужных мне строк остаются пустыми. Когда я нажимаю кнопку, я проверяю в событии CellContentClick, чтобы увидеть, равен ли ColumnIndex 10 (который является столбцом кнопки), он сообщает мне, что ColumnIndex равен 0, хотя это последний столбец. Затем, когда я перезагружаю сетку, я снова вызываю метод BindHistoryGrid, который удаляет столбец, если он существует, и повторно добавляет его. На этот раз он правильно устанавливает текст кнопки. Происходит ли странное поведение, которого я не вижу? Как установить для кнопки ColumnIndex значение 10 при первом добавлении (даже если оно говорит мне, что это 10)?

    private DataGridViewButtonColumn PDFButtonColumn;

    private void BindHistoryGrid()
    {
        dataGridViewStmt.DataSource = ah.getAccountHistory(0, dateTimePicker1.Value, dateTimePicker2.Value);

        if (dataGridViewStmt.Columns["GetPDFFile"] != null)
            dataGridViewStmt.Columns.Remove("GetPDFFile");

        dataGridViewStmt.Columns[0].DisplayIndex = 0;
        dataGridViewStmt.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        dataGridViewStmt.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
        dataGridViewStmt.Columns[0].Visible = false;
        dataGridViewStmt.Columns[1].Visible = false;
        dataGridViewStmt.Columns.Add(PDFButtonColumn);

        dataGridViewStmt.RowHeadersVisible = false;
        dataGridViewStmt.ReadOnly = true;
        dataGridViewStmt.AllowUserToAddRows = false;

        foreach (DataGridViewRow row in dataGridViewStmt.Rows)
        {
            //if (((string)row.Cells[5].Value).Contains("Invoice"))
            if (((int)row.Cells[9].Value) > 0)
            {
                ((DataGridViewButtonCell)(row.Cells[10])).Value = "Get Invoice";
            }
            else
            {
                ((DataGridViewButtonCell)(row.Cells[10])).Value = "";
            }
        }
     }


    private void dataGridViewStmt_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 10 && dataGridViewStmt.CurrentRow.Cells[6].Value != System.DBNull.Value)
        {
            string pdfFile = "";
            int docID = 0;

            pdfFile = (string)dataGridViewStmt.CurrentRow.Cells[5].Value + ".pdf";
            docID = (int)dataGridViewStmt.CurrentRow.Cells[9].Value;

            if (docID > 0)
            {
                getPDFFile(docID, pdfFile, "pdf");
            }
            else
            {
                MessageBox.Show("No invoice available for this item";                }
        }
    } 

Ответы [ 3 ]

0 голосов
/ 26 декабря 2009

Я не получил ни одного ответа здесь, поэтому я разместил на другом форуме. В конце концов я получил своего рода ответ, но все еще довольно расплывчато. В ответ я получил, что для сохранения ресурсов сетка не всегда обновляется сама. Например, если у вас есть форма с элементом управления вкладками, которая имеет 2 вкладки, поместите сетку на 1-ю вкладку и задайте свойства столбца после привязки в загрузке формы. Это будет работать Однако при размещении сетки на 2-й вкладке использование той же привязки не будет работать:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/99ab9fbf-9eaa-4eef-86b8-8f4e49fa81c5

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

0 голосов
/ 21 января 2014

У меня была та же проблема. Первоначально у меня был DataGridView в отдельной форме, и он прекрасно работал со столбцом кнопки - который я добавляю в код после настройки источника данных. Однако, когда я решил переместить сетку на другую форму с помощью элемента управления с вкладками (как это происходит на странице с вкладками (2)), индекс столбца кнопки продолжал возвращаться к нулю. Конечно, в сетке он выглядел совершенно нормально, то есть в правильном физическом расположении, и если я прошел по коду в режиме отладки, индекс не изменился, но при запуске программы он изменился! Очень расстраивает.

Я решил это, установив на вкладке страницу, на которой была расположена моя сетка, ДО установки источника данных.

Мой простой процесс был таким (я использую VB10):

TabControl1.SelectedIndex = 2 ' this is where the datagridview is
MyGrid.DataSource = Nothing
MyGrid.Columns.Clear

'Я выполняю команду Sql в DataReader, затем заполняю DataTable и затем назначаю ее сетке

MyGrid.DataSource = MyDataTable

'Теперь добавьте столбец кнопок

Dim btnCol as New DatGridViewButtonColumn
MyGrid.Columns.Add(btnCol) 
0 голосов
/ 23 декабря 2009

Я вызвал мой bindGrid () метод из двух мест после InitializeComponent () в конструкторе формы , а также из form1_load ( ) . меня устраивает.

надеюсь, это тоже поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...