Datagridview szerkeszthetősége

Datagridview szerkeszthetősége
2015-11-22T14:05:33+01:00
2015-11-22T15:46:56+01:00
2022-12-03T01:15:39+01:00
Paleko
Egy primitív nyelvi fordítót készítek. A Datagridview-ben 2 oszlopom van, a magyar meg az angol. A kifejezések egy XML-ból jönnek:

public static IDictionary<string, string> Retrieve(string filename) { return XElement.Parse(File.ReadAllText(filename)) .Elements() .ToDictionary(k => k.Name.ToString(), v => v.Value.ToString()); }
A Datagridview.Datasource előállítása:

dataGridView1.DataSource = (from entry in dictionary orderby entry.Key select new{entry.Key,entry.Value}).ToList();
Szükségem lenne arra, hogy a View-ben szerkeszteni lehessen a kifejezéseket, de nem megy az 'Istennek sem. Egyértelmű, hogy a View.Readonly = false lenne a megoldás, de nem. Arra gyanakszom, hogy a datasource blokkolja a szerkeszthetőséget.

Kérek szépen egy kis segítséget, hogyan tehetném szerkeszthetővé a View-t!
Mutasd a teljes hozzászólást!
Kicsit jobban utánanéztem (rég volt, bocsi): nem lehet IDictionary a DataSource, így javaslom a saját osztály használatát:

public class Mydata { public string MyKey { get; set; } public string MyValue { get; set; } }
és az abba való lekérdezést:

public partial class Form1 : Form { private Dictionary<string, string> dictionary = new Dictionary<string, string>(); private List<Mydata> myList; public Form1() { InitializeComponent(); dictionary.Add("asztal", "table"); dictionary.Add("szoba", "room"); dictionary.Add("helyszín", "site"); myList = (from entry in dictionary orderby entry.Key select new Mydata() { MyKey = entry.Key, MyValue = entry.Value }).ToList(); dataGridView1.DataSource = myList; }
Utána szerkeszthető lesz és a változtatásokat a myList tartalmazza.
Mutasd a teljes hozzászólást!

  • Mutasd a teljes hozzászólást!
  • Sajnos nem működik.
    Kiteszem az egész kódot. A Winformon van egy Datagridview, meg 3 gomb:

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Linq; using System.IO; namespace DigiDict { public partial class Form1 : Form { public Dictionary<string, string> dictionary = new Dictionary<string, string>(); public string fileName= "szotar.xml"; public Form1() { InitializeComponent(); dictionary.Add("asztal", "table"); dictionary.Add("szoba", "room"); dictionary.Add("helyszín", "site") ; View(); } private void View() { dataGridView1.DataSource = (from entry in dictionary orderby entry.Key select new{entry.Key,entry.Value}).ToList(); dataGridView1.EditMode= DataGridViewEditMode.EditOnEnter; dataGridView1.ReadOnly = false; //if(dataGridView1.SelectedCells.Count>0) dataGridView1.SelectedCells[0].ReadOnly=false; //dataGridView1.Columns["Value"].ReadOnly = false; } private void button1_Click(object sender, EventArgs e) //save { Store(dictionary, fileName); } private void button2_Click(object sender, EventArgs e) //clear { dictionary = new Dictionary<string, string>(); View(); button1.Enabled = false; } private void button3_Click(object sender, EventArgs e) //load { dictionary = (Dictionary<string, string>) Retrieve(fileName); View(); button1.Enabled = true; } public static void Store(IDictionary<string, string> d, string filename) { new XElement("root", d.Select(kv => new XElement(kv.Key, kv.Value))) .Save(filename, SaveOptions.OmitDuplicateNamespaces); } public static IDictionary<string, string> Retrieve(string filename) { return XElement.Parse(File.ReadAllText(filename)) .Elements() .ToDictionary(k => k.Name.ToString(), v => v.Value.ToString()); } private void dataGridView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Tab && dataGridView1.CurrentCell.ColumnIndex == 1) { e.Handled = true; DataGridViewCell cell = dataGridView1.Rows[0].Cells[0]; dataGridView1.CurrentCell = cell; dataGridView1.BeginEdit(true); } } } }
    Mutasd a teljes hozzászólást!
  • Helló!

    A

    select new {
    kifejezéssel egy anonymous típust készítesz. Hiába lenne szerkeszthető, a változtatásokat nem tudnád kinyerni.

    Szerintem maga a Dictionary is közvetlenül köthető a Datagridview-hoz (property-k neve: Key és Value), miért nem azt teszed?

    Ha a rendezés miatt, akkor esetedben talán a legegyszerűbb ha közvetlenül SortedDictionary-t használsz (abba válogasd bele az értékeket az XML-ből).

    De a lényeg, hogy a műveletek után (rendezés stb.) az adatok valami konkrét osztályba (akár új Dictionary példányba) kerüljenek.
    Mutasd a teljes hozzászólást!
  • Kicsit jobban utánanéztem (rég volt, bocsi): nem lehet IDictionary a DataSource, így javaslom a saját osztály használatát:

    public class Mydata { public string MyKey { get; set; } public string MyValue { get; set; } }
    és az abba való lekérdezést:

    public partial class Form1 : Form { private Dictionary<string, string> dictionary = new Dictionary<string, string>(); private List<Mydata> myList; public Form1() { InitializeComponent(); dictionary.Add("asztal", "table"); dictionary.Add("szoba", "room"); dictionary.Add("helyszín", "site"); myList = (from entry in dictionary orderby entry.Key select new Mydata() { MyKey = entry.Key, MyValue = entry.Value }).ToList(); dataGridView1.DataSource = myList; }
    Utána szerkeszthető lesz és a változtatásokat a myList tartalmazza.
    Mutasd a teljes hozzászólást!
  • Köszönöm szépen!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd