Wrap eine Zeile in DataGridView

Ich versuche zu erstellen, ein chatbot. Ich werde sehr ehrlich, das UI ist nicht meine Stärke. Ich arbeite auf dem backend der chatbot als in die Logik-Teil, aber zum testen brauche ich einen einwandfreien, UI. So, ich entschied mich für die einfacher zu verwenden winforms. Ich erstellte eine einzelne Spalte im DataGridView-und alle geschriebenen text in einem Textfeld am unteren Teil des chat-Fensters wird angezeigt, wie DataGridView-Zeilen. Der winform verankert ist, um in alle Richtungen wachsen. Also, wenn ich laden Sie die exe-Datei, es zeigt, wie ein Miniatur-Fenster, wenn ich maximieren, das DataGridView-Teil und die textbox wachsen entsprechend.

Geben, wenn ich eine lange string-und die winform ist nicht in einem maximierten Zustand, der text wird nicht umgebrochen, in der Zeile in den sichtbaren Bereich. Es erstreckt sich horizontal und so offensichtlich nicht auf dem Bildschirm sichtbar ist. Wenn ich das Fenster maximieren, ich kann den text sehen. Wenn ich eine veryyy langen string, und maximieren Sie das Fenster, nur, dass viel von der string angezeigt wird in der Zeile, wie es passt die Display-Größe.

Was ich tun will: ich will den text fließen automatisch in die Zeilen, so dass, unabhängig davon, ob mein Fenster maximiert oder minimiert, ich sehe den gesamten Text in das Fenster, in einem eingewickelt format.

Was ich versucht habe:

dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
  • diese Frage bezieht sich auf eine textbox, diese in ein datagridview, das ist sehr Verschieden.
  • Es funktioniert in meinem test-Programm. Kann es sein, dass Sie das überschreiben der DefaultCellStyle.WapMode irgendwo? überprüfen Sie dieses z.B. im form-load, mit linq; dataGridView1.Zeilen.SelectMany(row => Reihe.Zellen).Alle(Zelle => Zelle.InheritedStyle == DataGridViewTriState.True);
  • Die Sache ist, wenn die Wörter werden durch Leerzeichen getrennt, es wickelt, aber wenn Ihr einen einzelnen, langen string, dann wickeln funktioniert nicht.
  • DataGridViewTextBox führt Umhüllung mit word-break. Es bedeutet, dass, wenn Sie einen langen text, die Pause wird nur am Ende der Wörter. Auf Ihrer Anforderung basieren, müssen Sie die Zeichen-Pause, wenn der Zeilenumbruch. Dies zu tun, müssen Sie erstellen eine benutzerdefinierte Zelle, und führen Sie Charakter-break Umbruch.
InformationsquelleAutor KChow | 2016-09-23



One Reply
  1. 3

    DataGridViewTextBox führt Umhüllung mit word-break. Es bedeutet, dass, wenn Sie einen langen text, die Pause wird nur am Ende der Wörter. Auf Ihrer Anforderung basieren, müssen Sie die Zeichen-Pause, wenn der Zeilenumbruch. Dies zu tun, müssen Sie erstellen eine benutzerdefinierte Zelle, und führen Sie Charakter-Pause Umhüllung dieser Weise:

    • Überschreiben GetPreferredSize Methode zur Berechnung der Höhe der Zelle/Zeile basierend auf den Charakter brechen Zeilenumbruch. So so können Sie Graphics.MeasureString Methode.

    • Überschreiben Paint Methode zeichnen Sie die verpackte Zeichenkette mit Zeichen brechen mit Graphics.DrawString Methode.

    Du durchführen können diese Einstellungen:

    • Verwenden Sie die Breite der DataGridView für Ihre Spalte, Sie sollten es AutoSizeMode zu Fill. Auf diese Weise werden die Spaltenbreite wird, füllen Sie das raster und ändern Ihre Größe in Abhängigkeit von der Rastergröße. Auch wenn Sie mehr als eine Spalte, können Sie FillWeight zur Steuerung der Prozent-Spalte Größe in relation zu den anderen Spalten.

    • Wickeln Sie den text in Spalte setzen Sie DefaultCellStyle.WrapMode der Spalte DataGridViewTriState.True.

    • Damit die Zeilen auto-Größe sollten Sie AutoSizeRowMode von DataGridView zu DataGridViewAutoSizeRowsMode.AllCells.

    • Registrieren Sie die benutzerdefinierte Zelle, die wir erstellt haben, als CellTemplate von der Spalte.

    MyDataGridViewTextBoxCell

    Dieser Zelle führt den Zeilenumbruch mit Zeichen-break anstelle von Wort zu brechen.

    public class MyDataGridViewTextBoxCell:DataGridViewTextBoxCell
    {
        protected override Size GetPreferredSize(Graphics graphics, 
            DataGridViewCellStyle cellStyle, int rowIndex, Size constraintSize)
        {
            if(cellStyle.WrapMode== DataGridViewTriState.True && this.RowIndex>=0)
            {
                var value= string.Format("{0}", this.FormattedValue);
                using (var g = this.OwningColumn.DataGridView.CreateGraphics())
                {
                    var r =  g.MeasureString(value, cellStyle.Font, this.OwningColumn.Width )
                              .ToSize();
                    r.Width += cellStyle.Padding.Left + cellStyle.Padding.Right;
                    r.Height += cellStyle.Padding.Top + cellStyle.Padding.Bottom;
                    return r;
                }
            }
            else
            {
                return base.GetPreferredSize(graphics, cellStyle, rowIndex, constraintSize);
            }
        }
        protected override void Paint(Graphics graphics, Rectangle clipBounds, 
            Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, 
            object value, object formattedValue, string errorText, 
            DataGridViewCellStyle cellStyle, 
            DataGridViewAdvancedBorderStyle advancedBorderStyle, 
            DataGridViewPaintParts paintParts)
        {
            base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, 
                formattedValue, errorText, cellStyle, advancedBorderStyle, 
                paintParts & ~ DataGridViewPaintParts.ContentForeground);
            graphics.DrawString(string.Format("{0}", formattedValue), 
                cellStyle.Font, Brushes.Black, cellBounds);
        }
    }

    Beispiel

    public class Model
    {
        public string Text { get; set; }
    }
    
    BindingList<Model> list = new BindingList<Model>();
    
    private void Form1_Load(object sender, EventArgs e)
    {
        var column1 = new DataGridViewTextBoxColumn();
        column1.CellTemplate = new MyDataGridViewTextBoxCell();
        column1.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        column1.DataPropertyName = "Text";
        column1.DefaultCellStyle = new DataGridViewCellStyle();
        column1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
        column1.HeaderText = "Text";
        column1.Name = "column1";
    
        dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
        dataGridView1.Columns.Add(column1);
    
        this.dataGridView1.DataSource = list;
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        list.Add(new Model() { Text = textBox1.Text });
    }
    • Genial … Es hat hervorragend funktioniert. Vielen Dank für die Hilfe. Es zu schätzen wissen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.