سؤال

أريد أن يكون لدي datagridview يحتوي على عمودين. سيكون العمود الأول دائمًا من نوع DataGridViewComboboxColumn. استنادًا إلى التحديد في هذا العمود ، أود أن أتمكن من تغيير الخلية المقابلة في العمود الثاني إما إلى DataGridViewComboboxCell أو DataGridViewTextBoxCell.

أعتقد أنني بحاجة فقط إلى جعل العمود الثاني من نوع DataGridViewColumn ، لكن لا أفهم ميكانيكا كيفية تغيير نوع الخلية أثناء الطيران.

أنا أعمل مع VB.NET في Visual Studio 2005.

شكرا لك مقدما!

تحديث: تتمثل إحدى الطرق المحيطة به في جعل العمود الثاني كـ DataGridViewComboboxColumn ، وتغيير سمات الخلية بحيث يتصرف مثل القائمة المنسدلة ، أو كقائمة منسد (قابلة للتحرير) بدون عناصر. هذا الأخير يشبه مربع نص يمكنني العيش معه ، ولن يتضمن تغيير نوع الخلية.

هل كانت مفيدة؟

المحلول

ليس لدي إصدار VB.NET ، ولكن نأمل أن يساعدك هذا المقتطف السريع C# أو توجيهك في الاتجاه الصحيح.

في هذا المثال ، قمت بإعداد DataGridView بسيط مع عمودين. الأول هو DataGridViewComboBox ملء مع خيارين: "نص" أو "التحرير والسرد".

يتم تعيين العمود الثاني في البداية على DataGridViewTextBoxColumn من المصمم.

أنا أتعامل مع الحدث CurrentCellDirtyStateChanged على DataGridView. أتحقق مما إذا كانت الخلية متسخة وتحقق فقط من العمود الأول (ComboBox). يجب أن تتصل بـ ContedIt للحصول على القيمة الجديدة في التحرير والسرد وإلا فسوف تنظر إلى القيمة السابقة. استنادًا إلى التحديد في مربع التحرير والسرد ، قمت بعد ذلك بكتابة الخلية في العمود الثاني مع خلية جديدة من هذا النوع.

يمكنك إضافة المنطق الخاص بك (ملء الانخفاضات والتعامل مع القيمة). قد ترغب في تخزين القيمة ثم إعادتها إلى الخلية أو أي شيء آخر.

فيما يلي الرمز الذي استخدمته واختبار سريعًا وقذرًا في:

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (dataGridView1.IsCurrentCellDirty == false)
        {
            return;
        }

        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);

        if (dataGridView1.CurrentCell.ColumnIndex == 0)
        {               
            if (((string)dataGridView1.CurrentCell.Value) == "Text")
            {
                dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewTextBoxCell();
            }
            else if (((string)dataGridView1.CurrentCell.Value) == "Combo")
            {
                dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewComboBoxCell();
            }
        }
    }

فيما يلي ترجمة VB سريعة ، لقد اختبرت وأعمل.

Public Class Form1

Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged

    If DataGridView1.IsCurrentCellDirty = False Then
        Return
    End If

    DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)

    If DataGridView1.CurrentCell.ColumnIndex = 0 Then

        If CStr(DataGridView1.CurrentCell.Value) = "Text" Then
            DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewTextBoxCell

        ElseIf CStr(DataGridView1.CurrentCell.Value) = "Combo" Then
            DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewComboBoxCell
        End If

    End If


End Sub

الطبقة النهائية

سوف تفقد أي قيمة مخزنة في هذا العمود ، لذلك ستحتاج إلى حفظها أولاً.

جون

نصائح أخرى

يمكنك إنشاء قالب الخلية الخاص بك يستضيف عنصر تحكم المستخدم. في عنصر تحكم المستخدم ، يمكنك إضافة مربع نص و combobox ، وأضف طريقة/خاصية لإظهار واحدة وإخفاء آخر.

هذه العينة ينشئ خلية زر الراديو ، ليس من الصعب تغيير الرمز لاستضافة عنصر تحكم المستخدم.

dgvCell = new DataGridViewTextBoxCell();         // code to remove checkbox
        dgvCell.Value = string.Empty;
        dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top