wake-up-neo.net

Wie programmiere ich einen Zellenwert in DataGridView?

Ich habe eine DataGridView. Einige Zellen erhalten ihre Daten von einem seriellen Port: Ich möchte die Daten in die Zelle hineinschieben und das darunterliegende gebundene Objekt aktualisieren lassen.

Ich versuche so etwas:

SetValueFromSerial (decimal newValue)
{
    dataGridView.CurrentCell.Value = newValue;
}

die Verwendung eines Strings hilft nicht:

    dataGridView.CurrentCell.Value = newValue.ToString ();

In beiden Fällen sehe ich nichts im Raster und der zugrunde liegende Wert ist unverändert.

Ich habe Google gesucht und hier gesucht, aber nichts gefunden. (Ich habe vielleicht etwas verpasst, vielleicht etwas offensichtliches, aber ich bin nicht völlig faul.)

35
XXXXX

Wenn die Variable DataGridView eine Datenbasis ist, sollten Sie den Inhalt der Zelle nicht direkt ändern. Stattdessen sollten Sie das Datenobjekt ändern. Sie können auf dieses Objekt über die DataBoundItem der DataGridViewRow zugreifen:

MyObject obj = (MyObject)dataGridView.CurrentRow.DataBoundItem;
obj.MyProperty = newValue;

Beachten Sie, dass das gebundene Objekt INotifyPropertyChanged implementieren sollte, damit die Änderung in der DataGridView wiedergegeben wird.

33
Thomas Levesque
dataGridView1[1,1].Value="tes";
28
arced

Wenn Sie das Datenobjekt nicht aus irgendeinem Grund ändern möchten (z. B. möchten Sie eine Ansicht in Ihrem Raster anzeigen, es jedoch nicht als Teil des Datenquellenobjekts), möchten Sie Folgendes tun

1. Spalte manuell hinzufügen:

    DataGridViewColumn c = new DataGridViewColumn();
    DataGridViewCell cell = new DataGridViewTextBoxCell();

    c.CellTemplate = cell;
    c.HeaderText = "added";
    c.Name = "added";
    c.Visible = true;
dgv.Columns.Insert(0, c); 

2. Führen Sie im DataBindingComplete-Ereignis Folgendes aus: 

foreach (DataGridViewRow row in dgv.Rows)
{if (row.Cells[7].Value.ToString()=="1")
row.Cells[0].Value = "number one"; }

(nur ein dummes Beispiel)

denken Sie jedoch daran, dass IT HAS im DataBindingComplete enthalten ist. Andernfalls bleibt der Wert leer

5
BornToCode

Ich hatte das gleiche Problem mit SQL-Datenadapter 

folgendes funktioniert für mich gut

mydatgridview.Rows[x].Cells[x].Value="test"
mydatagridview.enabled = false 
mydatagridview.enabled = true 
4
Juergen

Ich suchte nach der Lösung, wie ich eine neue Zeile einfügen kann und wie man die einzelnen Werte der darin enthaltenen Zellen wie in Excel festlegt. Ich habe es mit folgendem Code gelöst:

dataGridView1.ReadOnly = false; //Before modifying, it is required.
dataGridView1.Rows.Add(); //Inserting first row if yet there is no row, first row number is '0'
dataGridView1.Rows[0].Cells[0].Value = "Razib, this is 0,0!"; //Setting the leftmost and topmost cell's value (Not the column header row!)
dataGridView1[1, 0].Value = "This is 0,1!"; //Setting the Second cell of the first row!

Hinweis:

  1. Zuvor habe ich die Spalten im Designmodus entworfen.
  2. Ich habe die Sichtbarkeit der Zeilenkopfzeile in der Eigenschaft dataagridview auf false gesetzt.
  3. Die letzte Zeile ist wichtig für das Verständnis: Wenn Sie den Index des Datagridview direkt angeben, ist die erste Zahl die Zellennummer, die zweite die Zeilennummer! Erinnere dich dran!

Hoffe, das könnte dir helfen.

4
Razib Ali

Erinnern Sie sich an Refresh DataGridView?

datagridview.refresh();
4
Graviton

Versuchen Sie es so:

dataGridView.CurrentCell.Value = newValue;

dataGridView.EndEdit();

dataGridView.CurrentCell.Value = newValue;

dataGridView.EndEdit();

Sie müssen zweimal schreiben ...

3

Ich bin auf das gleiche Problem gestoßen und habe es für VB.NET gelöst. Es ist das .NET Framework, also sollten Sie sich anpassen können. Wollte meine Lösung vergleichen und jetzt sehe ich, dass es auf meine Weise niemand zu lösen scheint.

Geben Sie eine Felddeklaration ein.

Private _currentDataView as DataView

Wenn Sie also alle Zeilen durchlaufen und nach einer Zelle suchen, die einen Wert enthält, den ich kenne, befindet sich neben der Zelle, die Sie ändern möchten, die Arbeit für mich.

Public Sub SetCellValue(ByVal value As String)
    Dim dataView As DataView = _currentDataView

    For i As Integer = 0 To dataView.Count - 1
        If dataView(i).Row.Item("projID").ToString.Equals("139") Then
            dataView(i).Row.Item("Comment") = value
            Exit For ' Exit early to save performance
        End If
    Next
End Sub

Damit Sie es besser verstehen können ... Ich weiß, dass ColumnName "projID" 139 ist. Ich Schleife, bis ich es finde und dann kann ich den Wert von "ColumnNameofCell" in meinem Fall "Comment" ändern. Ich verwende dies für Kommentare, die zur Laufzeit hinzugefügt wurden.

 dataview

1
Matthis Kohli

Wenn die Variable DataGridView mit DataSource = x gefüllt wurde (d. H. Ist datengebunden), müssen Sie die gebundenen Daten und nicht die DataGridView-Zellen selbst ändern. 

Eine Möglichkeit, aus einer bekannten Zeile oder Spalte auf diese Daten zuzugreifen, ist folgendermaßen:

(YourRow.DataBoundItem as DataRowView).Row['YourColumn'] = NewValue;
1
noelicus

in VB können Sie diese verwenden 

Dim selectedRow As DataRowView
selectedRow = dg.Rows(dg.CurrentCell.RowIndex).DataBoundItem
selectedRow("MyProp") = "myValue"
dg.NotifyCurrentCellDirty(True)

dank saeed serpooshan für die letzte reihe

1
Eric Draven

Die folgenden Arbeiten Ich kann mich irren, aber das Hinzufügen eines String-Werts scheint nicht mit einer DataGridView-Zelle kompatibel zu sein (ich hatte jedoch keine Hacks experimentiert oder ausprobiert).

DataGridViewName.Rows[0].Cells[0].Value = 1;
1
user2301036

Ich habe viele Methoden ausprobiert, und die einzige, die funktionierte, war UpdateCellValue:

dataGridView.Rows[rowIndex].Cells[columnIndex].Value = "New Value";
dataGridView.UpdateCellValue(columnIndex, rowIndex);

Ich hoffe geholfen zu haben. =)

0
gamendola
private void btn_Addtoreciept_Click(object sender, EventArgs e)
{            
    serial_number++;
    dataGridView_inventory.Rows[serial_number - 1].Cells[0].Value = serial_number;
    dataGridView_inventory.Rows[serial_number - 1].Cells[1].Value =comboBox_Reciept_name.Text;
    dataGridView_inventory.Rows[serial_number - 1].Cells[2].Value = numericUpDown_recieptprice.Value;
    dataGridView_inventory.Rows[serial_number - 1].Cells[3].Value = numericUpDown_Recieptpieces.Value;
    dataGridView_inventory.Rows[serial_number - 1].Cells[4].Value = numericUpDown_recieptprice.Value * numericUpDown_Recieptpieces.Value;
    numericUpDown_RecieptTotal.Value = serial_number;
}

beim ersten Mal geht es gut, aber beim zweiten Mal wird ein Fehler angezeigt "Index außerhalb des zulässigen Bereichs. Muss nicht negativ sein und die Größe der Sammlung unterschreiten in der Zelle erscheint eine weitere Zeile und dann funktioniert es für die nächste Zeile und weiter ... 

0
Asif Ali

Genau wie @Thomas gesagt, muss das Element, das Sie ändern möchten, INotifyPropertyChanged implementieren. Datenquelle ist aber auch wichtig. Es muss sich um BindingList handeln, die Sie einfach aus der Liste erstellen können.

Hier ist mein Beispiel - Datenquelle ist zuerst DataTable, die ich in List übergebe und dann BindingList erstelle. Dann erstelle ich BindingSource und verwende BindingList als DataSource von BindingSource. Schließlich verwendet DataSource aus DataGridView diese BindingSource.

 sp_Select_PersonTableAdapter adapter = new sp_Select_PersonTableAdapter();

 DataTable tbl = new DataTable();
 tbl.Merge(adapter.GetData());

 List<Person> list = tbl.AsEnumerable().Select(x => new Person
 {
     Id = (Int32) (x["Id"]),
     Ime = (string) (x["Name"] ?? ""),
     Priimek = (string) (x["LastName"] ?? "")
 }).ToList();

 BindingList<Person> bindingList = new BindingList<Person>(list);

 BindingSource bindingSource = new BindingSource();
 bindingSource.DataSource = bindingList;
 dgvPerson.DataSource = bindingSource;

Was auch sehr wichtig ist: Jeder Member-Setter jeder Klasse muss OnPropertyChanged () aufrufen. Ohne das geht es nicht. Meine Klasse sieht also so aus:

public class Person : INotifyPropertyChanged
    {
        private int _id;
        private string _name;
        private string _lastName;

        public int Id
        {
            get { return _id; }
            set
            {
                if (value != _id)
                {
                    _id = value;
                    OnPropertyChanged();
                }
            }
        }
        public string Name
        {
            get { return _name; }
            set
            {
                if (value != _name)
                {
                    _name = value;
                    OnPropertyChanged();
                }
            }
        }
        public string LastName
        {
            get { return _lastName; }
            set
            {
                if (value != _lastName)
                {
                    _lastName= value;
                    OnPropertyChanged();
                }
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }

    }

Weitere Informationen zu diesem Thema: http://msdn.Microsoft.com/de-de/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

0
FrenkyB