شرح - how to fill datagridview in c#




لا تؤدي إضافة أعمدة إلى داتاتابل إلى داتاغريدفيو إلى تحديث طريقة العرض (3)

هذا لا يبدو الحق. لاختبار بها، كتبت التطبيق بسيطة، أن يخلق داتاتابل ويضيف بعض البيانات لذلك. على زر 1 انقر عليه يربط الجدول إلى داتاغريدفيو. ثم، أضفت زر الثاني، الذي عند النقر فوقه، يضيف عمود آخر إلى داتاتابل الأساسية. عندما اختبرت ذلك، وأنا النقر على الزر الثاني، تعكس إمديالتي الشبكة التحديث. لاختبار العكس، أضفت زر الثالث الذي للملوثات العضوية الثابتة مربع حوار مع داتاغريدفيو أن يحصل ملزمة إلى نفس داتاتابل. في وقت التشغيل، ثم قمت بإضافة بعض القيم إلى داتاغريدفيو الأولى، وعندما نقرت على زر لإظهار الحوار، تنعكس التغييرات.

وجهة نظري هي، أنها من المفترض أن تبقى متزامنة. قد يكون مارك على حق عندما اقترح عليك التحقق من تعيين أوتوجينيراتيكولومنز إلى ترو. لا تحتاج إلى الاتصال داتابيند على الرغم من أن هذا فقط ل غريدفيو على شبكة الإنترنت. ربما يمكنك نشر ما تفعلونه، لأن هذا ينبغي أن تعمل.

كيف اختبرت ذلك:

        DataTable table = new DataTable();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            table.Columns.Add("Name");
            table.Columns.Add("Age", typeof(int));
            table.Rows.Add("Alex", 26);
            table.Rows.Add("Jim", 36);
            table.Rows.Add("Bob", 34);
            table.Rows.Add("Mike", 47);
            table.Rows.Add("Joe", 61);

            this.dataGridView1.DataSource = table;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            table.Columns.Add("Height", typeof(int));
            foreach (DataRow row in table.Rows)
            {
                row["Height"] = 100;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            GridViewer g = new GridViewer { DataSource = table };
            g.ShowDialog();
        }

        public partial class GridViewer : Form //just has a DataGridView on it
        {
            public GridViewer()
            {
            InitializeComponent();
            }

            public object DataSource
            {
                get { return this.dataGridView1.DataSource; }
                set { this.dataGridView1.DataSource = value; }
            }
        }

لدي داتاتابل التي يتم ملؤها من ملف كسف ثم، باستخدام داتاغريدفيو يتم تحرير البيانات في الذاكرة. بقدر ما أفهم أن التحرير البرمجي للبيانات يجب أن يتم على داتاتابل حيث يتم تحرير المستخدم عبر. داتاغريدفيو.

ولكن عند إضافة أعمدة برمجيا إلى داتاتابل، لا ينعكس تلقائيا في داتاغريدفيو وأظن أن المحادثة صحيح أيضا.

كيف يمكنك الحفاظ على اثنين متزامنين؟ اعتقدت أن فكرة ربط البيانات هي أن هذه الآلية تلقائية ...

هنا هو التعليمات البرمجية الإعداد ذات الصلة - WorksheetGridView الفئات الفرعية DataGridView


// Can access data directly
public DataTable data = new DataTable();

public WorksheetGridView()
{
    InitializeComponent();

    // Allow copying from table to clipboard
    this.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText;

    // TODO: how to allow both row and column selects?
    //this.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;

    // Load up a blank DataTable to hold user inputted data
    int i;
    const int numBlankRows = Config.Application.DefaultNumRows;
    const int numBlankCols = Config.Application.DefaultNumCols;
    // TODO: Figure out how to include this as a config variable
    DBNull dfltCellContent = DBNull.Value;
    DataRow tmpRow;
    // Add columns - i used for naming
    for (i = 0; i < numBlankCols; i++)
    {
        this.AddColumn(i);
    }

    // Add rows
    for (i = 0; i < numBlankRows; i++)
    {
       tmpRow = this.data.NewRow();
       // Fill cells with something (i.e. blank cells)
       foreach (DataColumn col in this.data.Columns)
       {
           tmpRow[col.ColumnName] = DBNull.Value;
       }
       this.data.Rows.Add(tmpRow);
    }
    // Link data to the view
    this.DataSource = this.data;
}

private void AddColumn(int colIndex)
{
    // Adds a column to the data array
    DataColumn tmpCol;
    tmpCol = new DataColumn();
    tmpCol.DataType = Type.GetType(Config.Application.DataType);
    tmpCol.ColumnName = "C" + colIndex.ToString();
    tmpCol.ReadOnly = false;
    tmpCol.Unique = false;
    tmpCol.AllowDBNull = true;
    this.data.Columns.Add(tmpCol);
}

البتة التي لا تعمل في وقت لاحق عندما أدعو AddColumn على سبيل المثال في هذه التعليمات البرمجية للتعامل مع لصق البيانات محددات علامة التبويب،


        public void PasteToCells(string mode)
        {
            // TODO: Write paste code
            int i;
            if (Clipboard.ContainsText())
            {
                string clipBoardContent = Clipboard.GetText();
                using (CsvReader pastedCsvReader = new CsvReader(
                    new StringReader(clipBoardContent), false, '\t'))
                {
                    // TODO: If more rows/cols than in data table then expand accordingly
                    int numPastedCols = pastedCsvReader.FieldCount;
                    int currRowIndex, currColumnIndex;
                    GetSelectedInsertPoint(out currRowIndex, out currColumnIndex);
                    // Make space for columns if needed
                    if (mode == "insertcols")
                    {
                        int baseIndex = this.data.Columns.Count;
                        for (i = 0; i < numPastedCols; i++)
                        {
                            //this.Columns.Add
                            // TODO: Doesn't work yet - do you edit the DataGridView and reflect to DataTable or vise-versa?
                            this.AddColumn(baseIndex + i);

                        }
                    }
                    while  (pastedCsvReader.ReadNextRecord()) 
                    {
                        // Make space for rows (row by row) if needed
                        if (mode == "insertrows")
                        {
                            this.data.NewRow();
                            // TODO: Add a row
                        }
                        // Populate the cells with valid pasted text
                        for (i = 0; i < numPastedCols; i++)
                        {
                            this.data.Rows[currRowIndex][currColumnIndex + i] = ConvertCellContent(pastedCsvReader[i]);
                        }
                        currRowIndex = currRowIndex + 1;

                    }



                }

            }
            else
            {
                // TODO: Do nothing?
                Console.WriteLine("No text on clipboard");
            }
        }

حاولت المثال الوارد أدناه، وأنها لا تعمل. ومع ذلك عندما أحاول القيام بذلك يتم توسيع شريط التمرير الأفقي والعقود لفترة وجيزة ولكن لا يتم تحديث الجدول في DataGridView فئة فرعية. ولكن العمود في DataTable الرغم من - على سبيل المثال لا أستطيع إضافة عمود من نفس الاسم، ويعكس عدد الأعمدة الأعمدة إضافية أيضا. هل هناك ربما خيار مصمم التي قد تحد من تحديث DataGridView ؟

أيضا إضافة صفوف يعمل بشكل جيد.

تم حلها:

تم تعيين AutoGeneratedColumns إلى AutoGeneratedColumns في التعليمات البرمجية المصمم على الرغم من كونها true في الحوار خصائص (وتعيين صراحة في التعليمات البرمجية). تم إنشاء الأعمدة الأولية برمجيا وحتى لا ينبغي أن يبدو ظهرت ولكن هذا لم يتم انتقاؤها منذ أن استمر رمز مصمم لتوليد "مصممة في" الأعمدة التي كانت تستخدم أصلا لتصحيح الأخطاء.

الأخلاقية: تحقق من رمز أوتوجينيراتد!

بالإضافة إلى ذلك، راجع هذه المشاركة وهذه المشاركة


هل تم تعيين أوتوجينيراتيكولومنز إلى ترو؟ إذا كنت تقوم بإجراء تغييرات بعد التجليد الأولي سيكون لديك أيضا للاتصال داتابيند () إلى إعادة تأكيد مصدر البيانات التي تم تغييرها. وأنا أعلم أن هذا صحيح لاستدعاء أجاكس، وأعتقد أنه صحيح بالنسبة للتحكم وينفورمز بوستباك.


هنا هو الحل الآخر الذي لا تحتاج إلى تعيين "اسم" إلى شبكة البيانات، بحيث شبكة البيانات يمكن أن يكون عنصر القالب.

(في حالتي، شبكة البيانات هي عنصر قالب داخل TabControl.ContentTemplate)

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

وهو ما يعني أنني ببساطة بحاجة إلى:

  1. ربط AutoGenerateColumns إلى خاصية كائن بلدي
  2. تعيين بروبيلي إلى فالس قبل إضافة عمود
  3. تعيين بروبيلي إلى صحيح بعد العمود المضافة.

إليك الرمز:

XAML:

<DataGrid AutoGenerateColumns="{Binding toggleToRefresh}"
          ItemsSource="{Binding dataTable}"
          />

C #:

 public class MyTabItem : ObservableObject 
 {
        private DataTable _dataTable = new DataTable();
        public DataTable dataTable
        {
            get { return _dataTable; }
        }

        private bool _toggleToRefresh = true;
        public bool toggleToRefresh
        {
            get { return _toggleToRefresh; }
            set
            {
                if (_toggleToRefresh != value)
                {
                    _toggleToRefresh = value;
                    RaisePropertyChanged("toggleToRefresh");
                }
            }
        }

        public void addDTColumn()
        {
            toggleToRefresh = false;
            string newColumnName = "x" + dataTable.Columns.Count.ToString();
            dataTable.Columns.Add(newColumnName, typeof(double));
            foreach (DataRow row in dataTable.Rows)
            {
                row[newColumnName] = 0.0;
            }
            toggleToRefresh = true;
        }

        public void addDTRow()
        {
            var row = dataTable.NewRow();
            foreach (DataColumn col in dataTable.Columns)
            {
                row[col.ColumnName] = 0.0;
            }
            dataTable.Rows.Add(row);
        }
 }

نأمل أن تكون هذه المساعدة :)







datatable