Amit Bisht
Amit Bisht

Reputation: 5136

Unable To set row visible false of a datagridview

I have a DataGridView where I set DataSource:

taskerEntities te = new taskerEntities();
var OMsMasterDescriptiveIndicators = te.MyTable.Select(x => new lccls {Id = x.Id, name = x.name }).ToList();
MyGrid.DataSource = OMsMasterDescriptiveIndicators;

with my class lccls as

public class lccls
    {
        public string Id { get; set; }
        public Nullable<decimal> name { get; set; }
    }

At a certain event I want to make the current row invisible:

 MyGrid.Rows[5].Visible = false;

But I am unable to do this. Instead an exception is thrown with the following error message:

Row associated with the currency manager's position cannot be made invisible

I suspect the reason is related to setting DataSource, but why?

Upvotes: 34

Views: 46112

Answers (8)

Nima M
Nima M

Reputation: 1

maybe this is old but:

Here an easy Way:

var item = dgv.Rows.Cast<DataGridViewRow>().FirstOrDefault(c => c.Cells[x].Value?.ToString() == X);
            if (item != null)
            {
                availableIpsDataGridView.CurrentCell = null;
                item.Visible = false;
            }

and visibling it with:

var item = dgv.Rows.Cast<DataGridViewRow>().FirstOrDefault(c => c.Cells[x].Value?.ToString() == X);
                if (item != null)
                {
                    item.Visible = true;
                }

Upvotes: 0

user2645606
user2645606

Reputation: 1

I tried to hide a row in a CellFormating event and it didn't worked. It looks like the currency maneger cann't be suspended for the row that raised the event than I deal with the row before (row 0 deals with the last row)

Private Sub DgView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DgView1.CellFormatting
        If DgView1.Rows(e.RowIndex).Cells(e.ColumnIndex).OwningColumn.Name = CoID Then
            Dim k = If(e.RowIndex = 0, DgView1.RowCount - 1, e.RowIndex - 1)
            DgView1.Rows(k).Visible = Countries.Rows(k)("Ro")
        End If
End Sub

Upvotes: 0

Hsmith
Hsmith

Reputation: 175

I know this is an old topic, but an alternative solution (my code is vb.net, but I assume it would translate)

If WO_DGV.CurrentCell.RowIndex = i Then
  'you cannot make invisible the row that is 'current'
  WO_DGV.CurrentCell = WO_DGV.Rows(i - 1).Cells("act") 
  'to get to this code I know that there is a row before i, which is why I can use i-1 as new focus
End If
WO_DGV.Rows(i).Visible = False 

Upvotes: 0

HassanRezai
HassanRezai

Reputation: 31

Maybe a little late to answer this topic but I suggest you to use DataTable.DefaultView.RowFilter property to filter what you need to show on the bounded DataGridView. Please check the following link for more informtion: https://learn.microsoft.com/en-us/dotnet/api/system.data.dataview.rowfilter?redirectedfrom=MSDN&view=netframework-4.8#System_Data_DataView_RowFilter

regards.

Upvotes: 0

Cristian UYT
Cristian UYT

Reputation: 21

Example

        foreach (DataGridViewRow rw in dataGridView1.Rows)
        {

        if (rw.Cells[14].Value.ToString() == "") // this Cell have a TEXT, 
            {
                CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[dataGridView1.DataSource];
                currencyManager1.SuspendBinding();
                rw.Visible = false; 
                currencyManager1.ResumeBinding();

            }
        }

this show only the row that have in the cell index 14, if this is blank or empty the whole row not show

Upvotes: 2

Amit Bisht
Amit Bisht

Reputation: 5136

After searching a lot, I got the solution

CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[MyGrid.DataSource];  
currencyManager1.SuspendBinding();
MyGrid.Rows[5].Visible = false;
currencyManager1.ResumeBinding();

Upvotes: 74

Moory Pc
Moory Pc

Reputation: 910

Cannot set yourDataGridView row visible property to false when current row index Will encounter such error if trying to hide current cell

soulution :

when yourDataGridView Data source is not null :

  CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[yourDataGridView.DataSource];
                       currencyManager1.SuspendBinding();
                       yourDataGridView.Rows[Target Index].Visible = false;
                       currencyManager1.ResumeBinding();

when yourDataGridView Data source is null :

 yourDataGridView.CurrentCell = null;
 yourDataGridView.Rows[Target Index].Visible = false;

Upvotes: 19

Wnqs Winnerneverquits
Wnqs Winnerneverquits

Reputation: 21

I have an example for U. I have a datagridview that may multiselected row. When i click the button to visible false row that selected. Try this:

foreach (DataGridViewRow row in dataGridView1.SelectedRows)
        {
            CurrencyManager currencyManager1 =(CurrencyManager)BindingContext[dataGridView1.DataSource];
                currencyManager1.SuspendBinding();
                dataGridView1.CurrentCell = null;
                row.Visible = false;
        }
        dataGridView1.Refresh();

Remember to set property SelectionMode: FullRowSelect

Upvotes: 2

Related Questions