none
ocultar linhas do grid menos a selecionada RRS feed

  • Pergunta

  • gente, não consigo fazer um for para percorrer o grid e ocultar as linhas do grid menos a de adição...

    seria o caso do usuário adicionar um registro, mas ficaria visível apenas essa última linha, tem como?

    sábado, 21 de janeiro de 2017 15:31

Respostas

  • Olá Tracaja,
    sim é possivel

    Primeiro, é necessário tirar o foco da linha pra poder deixar-la invisível(isso se faz com o  CurrencyManager).Sobre deixar a ultima linha, podemos controlar isso pelo loop.

    CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[MyGrid.DataSource];  
    currencyManager1.SuspendBinding();
    //codigo pra ocultar as linhas
    var linhas = dataGridView1.Rows.Count;
    if(linhas >1){
    for(int i=0;i<linhas-2;i++)//levando em consideração que a linha 0 é o header e vc quer deixar ela visível
    dataGridView1.Rows[i].Visible = false;
    }
    currencyManager1.ResumeBinding();

    --
    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta


    • Editado Rodrigo Suleiman sábado, 21 de janeiro de 2017 18:38
    • Marcado como Resposta tracaja sábado, 21 de janeiro de 2017 18:49
    sábado, 21 de janeiro de 2017 18:37
  • Tracaja,legal que deu certo.
    Não está abusando,estamos aqui para nos ajudarmos!

    A melhor pratica, é no form pai(form1) você criar uma metodo/proprieda publica que recebe os dados e da o bind.No filho(form2),você cria um construtor que recebe o Form1 como parâmetro.Dentro desse construtor,você seta uma variavel da classe do form2.
    Ai no OnClose do form2, você chama esse metodo/propridade passando o novo datasource(atualizado) pro form1 e da o bind.

    Exemplo:

    Form1

    public partial class Form1 : Form {
        public Form1() {
         
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e) {
            Form2 oForm = new Form2(this);
            oForm.Show();
        }
        public void PerformRefresh() {
            this.label1.Text = DateTime.Now.ToLongTimeString();
        }
    }

    Form2

    public class Form2 : Form {
        Form1 _owner;
        public Form2(Form1 owner) {
            _owner = owner;
            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form2_FormClosing);
        }
        private void Form2_FormClosing(object sender, FormClosingEventArgs e) {
            _owner.PerformRefresh();
        }
    }

    []'s

    --
    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta

    • Marcado como Resposta tracaja sexta-feira, 27 de janeiro de 2017 21:07
    sábado, 21 de janeiro de 2017 20:30

Todas as Respostas

  • Olá tracaja,

    Partindo do principio que você está se referindo a um grid do tipo GridView,é possivel oculpar as linhas dessa forma:

    var linhas = dataGridView1.Rows.Count;
    for(int i=1;i<linhas-1;i++)//levando em consideração que a linha 0 é o header e vc quer deixar ela visivel
    dataGridView1.Rows[i].Visible = false;

    certo?
    []'s

    --
    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta


    sábado, 21 de janeiro de 2017 15:41
  • beleza vou testar já
    sábado, 21 de janeiro de 2017 18:11
  • deu um erro, Row associated with the currency manager´s position cannot be made invisible.

    Acontece o seguinte, eu queria deixar a linha de adição em false, e qdo o usuário clica um botão, eu esconderia as linhas existentes e deixaria só a de adição.

    eu deixei a linha de adição selecionada e deu esse erro, aí eu tirei a adição, e ele removeu só uma linha.

    Não tem um jeito de falar - deixe somente a linha de adição - mesmo que eu tenha que deixar habilitada? pq eu não sei como me referir a essa linha....

    sábado, 21 de janeiro de 2017 18:23
  • tá, tirei o -1 do seu código no botao, deixei o addrows false no grid

    adicionei o addrows true no botão

    aí ele ocultou todas as linhas menos uma e fiquei com mais a de adição...

    tá quase, quero que fique só a de adição....

    sábado, 21 de janeiro de 2017 18:32
  • Olá Tracaja,
    sim é possivel

    Primeiro, é necessário tirar o foco da linha pra poder deixar-la invisível(isso se faz com o  CurrencyManager).Sobre deixar a ultima linha, podemos controlar isso pelo loop.

    CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[MyGrid.DataSource];  
    currencyManager1.SuspendBinding();
    //codigo pra ocultar as linhas
    var linhas = dataGridView1.Rows.Count;
    if(linhas >1){
    for(int i=0;i<linhas-2;i++)//levando em consideração que a linha 0 é o header e vc quer deixar ela visível
    dataGridView1.Rows[i].Visible = false;
    }
    currencyManager1.ResumeBinding();

    --
    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta


    • Editado Rodrigo Suleiman sábado, 21 de janeiro de 2017 18:38
    • Marcado como Resposta tracaja sábado, 21 de janeiro de 2017 18:49
    sábado, 21 de janeiro de 2017 18:37
  • Assim foi cara:

    CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[dgv.DataSource];
                currencyManager1.SuspendBinding();
                //codigo pra ocultar as linhas
                var linhas = dgv.Rows.Count;
                if (linhas > 1)
                {
                    for (int i = 0; i < linhas; i++)//levando em consideração que a linha 0 é o header e vc quer deixar ela visível
                        dgv.Rows[i].Visible = false;

                }
                currencyManager1.ResumeBinding();

                dgv.AllowUserToAddRows = true;

    Valeu mesmo! Tava quebrando a cabeça pra fazer isso....puxa vida....

    Vou testar a adição agora...

    sábado, 21 de janeiro de 2017 18:49
  • perfeito!!! ficou exatamente como eu queria!

    Obrigado!

    sábado, 21 de janeiro de 2017 18:51
  • deixa abusar mais um pouco da sua boa vontade...

    esse grid é pra adição, está no form2.

    pelo form1 eu chamo ele pra adicionar. carrego os grids com os dados em cada form.

    depois que eu faço a adição, e fecho o grid do form2, como eu atualizo o grid do form1 automaticamente?

    se eu puser o fill no evento onclosing do form2 dá certo? ou coloco no form1 visiblechanged? qual a melhor prática?

    sábado, 21 de janeiro de 2017 18:55
  • Tracaja,legal que deu certo.
    Não está abusando,estamos aqui para nos ajudarmos!

    A melhor pratica, é no form pai(form1) você criar uma metodo/proprieda publica que recebe os dados e da o bind.No filho(form2),você cria um construtor que recebe o Form1 como parâmetro.Dentro desse construtor,você seta uma variavel da classe do form2.
    Ai no OnClose do form2, você chama esse metodo/propridade passando o novo datasource(atualizado) pro form1 e da o bind.

    Exemplo:

    Form1

    public partial class Form1 : Form {
        public Form1() {
         
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e) {
            Form2 oForm = new Form2(this);
            oForm.Show();
        }
        public void PerformRefresh() {
            this.label1.Text = DateTime.Now.ToLongTimeString();
        }
    }

    Form2

    public class Form2 : Form {
        Form1 _owner;
        public Form2(Form1 owner) {
            _owner = owner;
            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form2_FormClosing);
        }
        private void Form2_FormClosing(object sender, FormClosingEventArgs e) {
            _owner.PerformRefresh();
        }
    }

    []'s

    --
    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta

    • Marcado como Resposta tracaja sexta-feira, 27 de janeiro de 2017 21:07
    sábado, 21 de janeiro de 2017 20:30
  • Beleza, acho que é isso, pq tentei usar o fill em vários eventos e não funcionou.

    Vou testar e já retorno.

    Obrigado.

    domingo, 22 de janeiro de 2017 16:39
  • Perfeito! Valeu mesmo!

    Próximo desafio: fazer uma visualização nested no grid...vou trabalhar nisso, se tiver dúvida eu volto!

    Obrigado mais uma vez.

    Até+.

    domingo, 22 de janeiro de 2017 19:54