[c# winforms datagrid]textboxcolumnstyle update werkt niet

Pagina: 1
Acties:

  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

Topicstarter
Ik heb een heel irritant probleem, dat waarschijnlijk een heel eenvoudige oplossing heeft. Ik heb hier al ettelijke uren naar oplossingen gezocht, maar heb nog nergens hetzelfde probleem teruggevonden.

Bij het editen van een textboxcolumnstyle-cel in mijn datagrid, wordt de nieuw ingegeven waarde niet teruggepost naar de cell-waarde van de datagrid. Het bizarre is echter, dat ik enkele custom columnstyles gemaakt heb, en hierbij lukt de update van de cell wel.

Ik heb de volgende zaken uitgeprobeerd :
- Methode SetDataBinding van het datagrid gebruikt (met dataset,tablename).
- Properties Datasource en DataMember rechtstreeks aangepast (dataset, tablename).
- datatable rechtstreeks gekoppeld aan datasource.
- de standaard GridTableStyle gebruikt (dus het kan niet aan de gridtablestyle liggen)
- in plaats van table een editable view gemaakt, en die gekoppeld...


Ik wordt echt desperate.. :'(

ik veronderstel dat mijn probleem ligt bij het ophalen van de dataset of koppelen van het datagrid, vandaar het stukje relevante code :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
        public OleDbDataAdapter GetData(CoreGrid coregrid) {
            //fill grid
            string table=coregrid.TableName;
            string where=coregrid.WhereClause;
            OleDbDataAdapter oDa = new OleDbDataAdapter();
            if ((this.Open()==false) || (table==null)) {
                return oDa;
            }
            try {   
                string extwhere=ExtendWhereForParentGrid(table,coregrid.ParentGrid,where);
                oDa=FillDataSet(table,extwhere);
            } catch (System.Exception e) {
                MessageBox.Show("GetData: "+e.ToString());  
            }
            
//          coregrid.DataGrid.DataSource=dataSet;
//          coregrid.DataGrid.DataMember=table;
            
            coregrid.DataGrid.DataSource=dataSet.Tables[table];

//          coregrid.DataGrid.SetDataBinding(dataSet,table);
            return oDa;
        }
        
        private OleDbDataAdapter FillDataSet(string table,string where) {
            string s=TranslateMappingToTable(table);
            string sql="select * from [";
            sql+=s+"]";
            if (where!="") {
                sql+=" WHERE " + where;
            }
            //MessageBox.Show("Execute sql : "+sql);
            OleDbDataAdapter oDa = new OleDbDataAdapter(sql, oleDbConn);
            if (dataSet.Tables.Contains(table)) {
                dataSet.Tables.Remove(table);
            }
            oDa.Fill(dataSet,table);
            return oDa;
        }


Het gaat dus NIET over het saven van de changes naar de database, hierover heb ik info genoeg, maar over de update van het datagrid zelf...

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
De waarde wordt ws pas naar de DataSet weggeschreven als je een andere rij in je datagrid geselecteerd hebt.

Je kan het ook forceren door de EndEdit method v/d datagrid aan te roepen op het moment dat je de nieuwe waarde naar de achterliggende datasource wilt wegschrijven.

[ Voor 44% gewijzigd door whoami op 23-02-2004 10:55 ]

https://fgheysels.github.io/


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

Topicstarter
whoami schreef op 23 februari 2004 @ 10:54:
De waarde wordt ws pas naar de DataSet weggeschreven als je een andere rij in je datagrid geselecteerd hebt.

Je kan het ook forceren door de EndEdit method v/d datagrid aan te roepen op het moment dat je de nieuwe waarde naar de achterliggende datasource wilt wegschrijven.
Die info had ik ook op het internet teruggevonden; maar het gaat hier zelfs niet over de dataset, maar over het datagrid zelf.. (dus wat je op het scherm ziet)
Veronderstel dat er een kolom is met aantallen, waar momenteel de waarde 0 instaat. Wanneer op de cel klik, en hier bv 10 van maak, en vervolgens de cell verlaat (andere rij, of zelfs andere control), komt hier terug de waarde 0 in te staan... heel bizar...

Op welke manier kan je het beste je datasource binden aan je datagrid, en kan daar het probleem liggen ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Ik heb het net ook even geprobeerd, en ik heb dat probleem niet.
Staat je TableStyle op ReadOnly ofzo?

Ik kan anders niet direct een ander probleem bedenken... Ik bind m'n DataSet of DataTable gewoon mbhv:
code:
1
dataGrid1.DataSource = myDataTable;

https://fgheysels.github.io/


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

Topicstarter
tijdsdruk, dus ipv naar het probleem verder te zoeken heb ik een workaround gemaakt,: mijn eigen textboxcolumn class. Ik post ze hier, mocht er nog iemand hetzelfde probleem hebben , dan kan men het direct oplossen

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System.Windows.Forms;
using System;

namespace Core.Forms {
    public class DataGridTextColumn: DataGridTextBoxColumn {
        
        private System.Windows.Forms.CurrencyManager _currencyManager;
        private int _rowNum;
        private bool _Editing;
        
        public DataGridTextColumn():base() {
            _currencyManager = null;
            _Editing = false;
            base.TextBox.TextAlign=HorizontalAlignment.Left;
        }
        
        protected override void Edit(
            System.Windows.Forms.CurrencyManager source, 
            int rowNum, 
            System.Drawing.Rectangle bounds, 
            bool readOnly, 
            string instantText, 
            bool cellIsVisible)
        {
            base.Edit(source, rowNum, bounds, readOnly, instantText, cellIsVisible);

            // Set current Rownum and Postion Manager
            _rowNum = rowNum;
            _currencyManager = source;
            _Editing=true;
        }
        
        protected override bool Commit(System.Windows.Forms.CurrencyManager dataSource, int rowNum)
        {
            if (_Editing)
            {
                _Editing = false;
                object val=this.TextBox.Text;
                if (val==null) {
                    val=DBNull.Value;
                }
                SetColumnValueAtRow(dataSource, rowNum, val );
            }
            return true;
        }
        
    }
}


Ik ben echter nog steeds geïnteresseerd in de reden waarom de standaard textboxcolumnstyle niet werk...