سؤال

لقد نظرت إلى الكثير من الأماكن وأنا أجد صعوبة في القيام بهذا الشيء الذي يفترض أنه بسيط.لدي نموذج Windows حيث يجب علي عرض DataGridView بسيط في هذا النموذج:

| (CheckBoxColumn) | Filepath | خيالي |

الآن، هناك مشكلتان.البيانات التي أحتاج إلى ربطها موجودة في قائمة كائنات مثل هذا:

    class FileObject
    {
        string filePath;
        string fileState;
    }

    //Now here's the list of these objects which I populate somehow. 
    List<FileObject> listFiles;
  • هل هناك أي طريقة فعالة لربط هذا مباشرة مع DataGridView بحيث يرتبط أعضاء مختلفين من الكائن في القائمة بأعمدة مختلفة ، ولكل منها خانة اختيار؟
  • لقد رأيت أمثلة لإضافة عمود مربع الاختيار إلى بيانات بيانات ، لكن لم يظهر أي منهم كيفية إضافته إلى صف "الرأس" أيضًا ، بحيث يمكن أن يتصرف كمربع "تحقق من كل"/"إلغاء تحديد كل".

أي مساعدة في كيفية تحقيق ذلك ستكون رائعة!أنا أكتب تطبيقات بسيطة بلغة C# ولكن لم أضطر أبدًا إلى العمل مع datagrids وما إلى ذلك.:(

شكرًا!

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

المحلول

يحتوي عنصر التحكم DataGridView على ميزة لإنشاء الأعمدة التي يمكن تعيينها بواسطة الخاصية AutoGenerateColumns تلقائيًا.القيمة الافتراضية لهذه الخاصية هي true - أي أن الأعمدة يتم إنشاؤها تلقائيًا بشكل افتراضي.

ومع ذلك، يتم إنشاء الأعمدة تلقائيًا فقط للخصائص العامة للكائن الذي تربطه بالشبكة - ولا تظهر الحقول.

يعمل الإنشاء التلقائي أيضًا مع أعمدة خانات الاختيار عندما تكون هناك خاصية منطقية عامة على الكائن المنضم.

لذا فإن أبسط طريقة لتحقيق متطلبيك الأولين هي تغيير متطلباتك FileObject فئة لهذا:

public class FileObject
{
    public string FilePath { get; set; }
    public string FileState { get; set; }
    public bool Selected { get; set; }
}

إذا لم تتمكن من تعديل هذه الفئة، فالأفضل هو إنشاء كائن مجمّع يحتوي على كائن ملف:

public class FileObjectWrapper
{
    private FileObject fileObject_;

    FileObjectWrapper()
    {
        fileObject_ = new FileObject();
    }

    FileObjectWrapper(FileObject fo)
    {
        fileObject_ = fo;
    }

    public string FilePath
    {
        get { return fileObject_.filePath; }
        set { fileObject_.filePath = value; }
    }

    public string FileState
    {
        get { return fileObject_.fileState; }
        set { fileObject_.fileState= value; }
    }

    public bool Selected { get; set; }
}

يمكنك بعد ذلك إنشاء قائمتك للربط بها (عادةً ما تكون قائمة BindingList هي الأفضل) للقيام بشيء مثل:

var fowList = new BindingList<FileObjectWrapper>();

foreach (FileObject fo in // here you have your list of file objects! )
{
    fowList.Add(new FileObjectWrapper(fo));
}

dataGridView1.DataSource = fowList;    

هناك العديد من الطرق للقيام بما سبق ولكن هذه فكرة عامة.


يمكنك أيضًا إضافة غير منضم DataGridViewCheckBoxColumn إلى الشبكة، على الرغم من أنني أجد أنه من الأسهل وجودها في القائمة المرتبطة.إليك الطريقة إذا كنت بحاجة إلى:

DataGridViewCheckBoxColumn c = new DataGridViewCheckBoxColumn();
c.Name = "Selected";
dataGridView1.Columns.Add(c);

أخيرًا، للحصول على خيار "SelectedAll" في الرأس، ستحتاج إلى استخدام تعليمات برمجية مخصصة.

المقالة الموجودة على CodeProject والتي ربطها Umesh بـ (عمود رأس CheckBox لـ DataGridView) يبدو من السهل جدًا تنفيذه - فهو ينشئ مخصصًا DataGridViewHeaderCell تجاوز Paint و OnMouseClick طُرق.

نصائح أخرى

يرجى الرجوع إلى المثال أدناه، ويعرض تماما ما تبحث عنه

p> http://www.codeproject.com/articles/20165 / مربع الاختيار رأس العمود-for-dataGridView

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top