Avatar billede e_c Nybegynder
05. november 2003 - 23:35 Der er 18 kommentarer og
1 løsning

Hente data fra datagrid

Hej,

Jeg har en winform hvor der er forskellige labels, textboxes og et datagrid. Mit datagrid består af 3 columns : Name, author og type. Mit problem er at jeg gerne vil kunne klikke på en row i datagrid'et og så vises de forskellige rows i deres respektive textboxes - dvs. hvis der f.eks. står : |aaa|bbb|ccc| i den klikkede column, så vil der stå aaa i min name_txtbox, bbb i mit author_txtbox og ccc i mit type_txtbox. Er det forståeligt?

Jeg har ikk rigtig kunne finde noget omkring det nogen steder!

/E_C
Avatar billede e_c Nybegynder
05. november 2003 - 23:36 #1
RETTELSE!!! "...den klikkede column", skulle selvfølgelig være ROW!
Avatar billede finger Nybegynder
06. november 2003 - 10:22 #2
I alle forms ligger der en klasse der holder alle databindings på en form. denne holder også databinding mellem dit datagrid og dit bagvedliggende dataset som grid'et binder til. her kan du hente hvilken row der peges på lige nu.
i eventen CurrentCellChanged kan du så ændre hvad din textboxes binder til.
Hvis du har lavet DataBinding fra din textboxes til dit datatable er det ret nemt! hvis du ikke har det vil jeg kraftigt anbefale dig at gøre det!
Ellers skal du ind i datasettet og hente dataen hver gang.
Her er noget kode til hvis du har databindet dine textboxes:


---------
//klasse definition:
private BindingManagerBase m_InteractionsBindingManagerBase;

//contructor efter initialize components:
this.m_InteractionsBindingManagerBase = this.BindingContext[MyDataSource, myDataMember];

//event:
private void myDatagrid_CurrentCellChanged(object sender, System.EventArgs e)
{
//m_InteractionsBindingManagerBase.Position tells which row the databindings are showing
m_InteractionsBindingManagerBase.Position = myDatagrid.CurrentRowIndex;

//hvis du ikke har databindings, skal du her kopiere data fra datasettet til dine boxes
}
Avatar billede e_c Nybegynder
06. november 2003 - 10:38 #3
Ok, men hvordan binder jeg mine textboxes til datagrid'et ? Ka ikk umiddelbart finde nogen metoder til det.

/oK
Avatar billede finger Nybegynder
06. november 2003 - 11:09 #4
myTextbox.DataBindings.Add(myTextboxPropertyToBind, MyDatasource, MyDataMember);

fx:

TextBox1.DataBindings.Add(Text, "DataSet1.Tables[0]", "NameColumn");
Avatar billede finger Nybegynder
06. november 2003 - 12:43 #5
kan du få det til at virke?
Avatar billede e_c Nybegynder
06. november 2003 - 12:46 #6
ikk lige umiddelbart, men det er ikk din kode der fejler. Det er noget med dataGrid.Datasource, som lige pludselig er null. Selv om dataset'et er fyldt og alt. Den fejl har ikk været der før.
Avatar billede finger Nybegynder
06. november 2003 - 12:54 #7
kan det være at du er kommet til at sætte databindings på dit datagrid manuelt?
eller har du skrevet denne linie rigtigt?:
this.m_InteractionsBindingManagerBase = this.BindingContext[MyDataSource, myDataMember];

det skal nok ligne noget i retning af:

this.m_InteractionsBindingManagerBase = this.BindingContext[DataSet1, DataTable1];
Avatar billede e_c Nybegynder
06. november 2003 - 13:04 #8
Jeg har denne metode, som bliver kaldt i formens constructor :

public void fillDataGrid()
        {
            DbHandler dbHandler = new DbHandler();
            ds = new DataSet();
            ds = dbHandler.FillGrid();
      her er fejlen -->    dataGrid.DataSource = ds.Tables["songs"].DefaultView;
            //dataGrid.SetDataBinding(ds, "songs");
            this.Controls.Add(dataGrid);
           
        }
Fejlen lyder : Value cannot be null.
og ds er blevet filled fra dbHandler'en.
Avatar billede e_c Nybegynder
06. november 2003 - 13:25 #9
Ok, så kom jeg lidt videre. Added et nyt dataset via form designeren. Så nu kommer porblemet i din kode :-)

Jeg har følgende i initializeComponent, under remAuthor_txt (som er en txtbox) :

this.remAuthor_txt.DataBindings.Add(new System.Windows.Forms.Binding("", "ds.Tables[1]", "author"));

Fejlen lyder nu : Can't bind to property or column author on DataSource
Avatar billede finger Nybegynder
06. november 2003 - 13:32 #10
this.remAuthor_txt.DataBindings.Add(new System.Windows.Forms.Binding("Text", "ds.Tables[1]", "author"));

Du skal angive hvilken property på din textbox du vil databinde. i dette tilfælde "Text"
Avatar billede e_c Nybegynder
06. november 2003 - 13:38 #11
Har rettet "author" til "songs.author", så det i doc'en,

this.remAuthor_txt.DataBindings.Add(new System.Windows.Forms.Binding("Text", "ds.Tables[1]", "songs.author"));

Dette giver følgende fejl : Can't create a child list for field songs.
Avatar billede finger Nybegynder
06. november 2003 - 14:44 #12
I ovenstående angiver du jo dit table 2 gange. prøv i stedet:

this.remAuthor_txt.DataBindings.Add(new System.Windows.Forms.Binding("Text", "ds", "songs.author"));

eller

this.remAuthor_txt.DataBindings.Add(new System.Windows.Forms.Binding("Text", "ds.Tables[\"songs\"]", "author"));
Avatar billede e_c Nybegynder
06. november 2003 - 15:43 #13
Har prøvet begge. Den vil ikk bind'e.
Fejl : Can't bind to property or column author on DataSource. Jeg sætter godt nok databindings manuelt. Kan ma få Visual Studio.NET tilat gøre det for en?
Avatar billede finger Nybegynder
06. november 2003 - 16:15 #14
du kan godt gøre det med visual studio. det kræver at du har et typed dataSet instantieret "trukket og afspejlet med et ikon nedrst i vinduet" på din form.
så kan du gennem din textbox's propertypage gøre det i databindings. Men datasettet skal så være typed.
Avatar billede finger Nybegynder
06. november 2003 - 16:25 #15
her er et kørende eksempel:
-------------form1--------------
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace WindowsApplication7
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private WindowsApplication7.myDataset myDataset1;
        private System.Windows.Forms.DataGrid dataGrid1;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.Button button1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;
        private BindingManagerBase m_BindingManagerBase;


        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            this.m_BindingManagerBase = this.BindingContext[myDataset1, "myTable"];
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.myDataset1 = new WindowsApplication7.myDataset();
            this.dataGrid1 = new System.Windows.Forms.DataGrid();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.button1 = new System.Windows.Forms.Button();
            ((System.ComponentModel.ISupportInitialize)(this.myDataset1)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit();
            this.SuspendLayout();
            //
            // myDataset1
            //
            this.myDataset1.DataSetName = "myDataset";
            this.myDataset1.Locale = new System.Globalization.CultureInfo("en-US");
            //
            // dataGrid1
            //
            this.dataGrid1.AllowNavigation = false;
            this.dataGrid1.CaptionVisible = false;
            this.dataGrid1.DataMember = "";
            this.dataGrid1.DataSource = this.myDataset1.myTable;
            this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
            this.dataGrid1.Location = new System.Drawing.Point(24, 8);
            this.dataGrid1.Name = "dataGrid1";
            this.dataGrid1.Size = new System.Drawing.Size(152, 112);
            this.dataGrid1.TabIndex = 0;
            this.dataGrid1.CurrentCellChanged += new System.EventHandler(this.dataGrid1_CurrentCellChanged);
            //
            // textBox1
            //
            this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.myDataset1, "myTable.myColumn"));
            this.textBox1.Location = new System.Drawing.Point(40, 160);
            this.textBox1.Name = "textBox1";
            this.textBox1.TabIndex = 1;
            this.textBox1.Text = "";
            //
            // button1
            //
            this.button1.Location = new System.Drawing.Point(56, 128);
            this.button1.Name = "button1";
            this.button1.TabIndex = 3;
            this.button1.Text = "Fill DataSet";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            //
            // Form1
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(208, 190);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.dataGrid1);
            this.Name = "Form1";
            this.Text = "Form1";
            ((System.ComponentModel.ISupportInitialize)(this.myDataset1)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit();
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

        private void dataGrid1_CurrentCellChanged(object sender, System.EventArgs e)
        {
            m_BindingManagerBase.Position = dataGrid1.CurrentRowIndex;
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            myDataset1.Clear();

            myDataset.myTableRow newRow = myDataset1.myTable.NewmyTableRow();
            newRow.myColumn = "hej1";
            myDataset1.myTable.AddmyTableRow(newRow);

            newRow = myDataset1.myTable.NewmyTableRow();
            newRow.myColumn = "hej2";
            myDataset1.myTable.AddmyTableRow(newRow);

            newRow = myDataset1.myTable.NewmyTableRow();
            newRow.myColumn = "hej3";
            myDataset1.myTable.AddmyTableRow(newRow);

            newRow = myDataset1.myTable.NewmyTableRow();
            newRow.myColumn = "hej4";
            myDataset1.myTable.AddmyTableRow(newRow);
        }
    }
}
Avatar billede e_c Nybegynder
06. november 2003 - 16:26 #16
Jeg gider ikk bakse med det mere, så jeg tager det datasettet hver gang. Du skal ha tusind tak for hjælpen!
Avatar billede finger Nybegynder
06. november 2003 - 16:28 #17
-------myDataSet.xsd----------
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="myDataset1" targetNamespace="http://tempuri.org/Dataset1.xsd" elementFormDefault="qualified"
    attributeFormDefault="qualified" xmlns="http://tempuri.org/Dataset1.xsd" xmlns:mstns="http://tempuri.org/Dataset1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="myDataset" msdata:IsDataSet="true">
        <xs:complexType>
            <xs:choice maxOccurs="unbounded">
                <xs:element name="myTable">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="myColumn" type="xs:string" minOccurs="0" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:choice>
        </xs:complexType>
    </xs:element>
</xs:schema>
Avatar billede finger Nybegynder
06. november 2003 - 16:29 #18
ok det er dit valg. Det er også lidt svært at forstå til at starte med, men når man har det er det max guld værd! det letter virkeligt meget!
tak for point
Avatar billede e_c Nybegynder
06. november 2003 - 16:30 #19
Havde ikke set dit eksempel, da jeg accepterede svar. Men kigger lige på det! Men stadig tak!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester