質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.83%

  • C#

    6006questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • MacOS(OSX)

    1702questions

    MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

  • Visual Studio

    1561questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Xamarin

    425questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

TableViewへ文字列の入力と、行の追加・方法を教えて下さい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 291

xero_con

score 4

 使用環境

PC:MaxOSX
環境:Visual Studio Community 2016 for mac
言語:c#

 やりたい事

イメージ説明

  1. TableViewを用いて、以下のことをしたい
  2. 写真の矢印の部分に文字列を直接入力したい
  3. 行を追加できるようにした(もしくは初めから大数の行を作成しておきたい)
  4. 入力されている文字列を参照したい

 現状

イメージ説明
矢印の部分はStoryboardでNSScrollViewでアウトレットしています

また、以下のコードで1枚目の写真のようにTableのヘッダー部分にタイトルを入れることはできました。

title_column.Title = "名前";
address_column.Title = "アドレス";

 試したこと

失敗1

title_column.TableView.AddColumn(new NSTableColumn("123")); 


失敗2

NSCell cell = new NSCell();       
cell.StringValue = "123";
title_column.DataCell = cell;

cell.StringValue = "345";
address_column.DataCell = cell;

 最後に

TableViewを用いずに、似たような事ができるコンポーネントがあり、それで解決出来るのでも結構です。
何か表を用いて、そこに入力(手入力、またはどこかから参照入力)が可能で、
入力した値が参照をおこないたいと考えています。

何か説明不足や、疑問点があれば仰ってください。すぐに追記いたします。
何卒、お知恵の拝借をよろしくお願い致します。

 追記(1)

ご回答いただきましたURLを元に、少しだけ改良致しました。
そのコードと、結果になります。

private void aaa()
{
    title_column.Title = "名前";
    address_column.Title = "アドレス";

    tableview.DataSource = new TableDataSource();
    tableview.Delegate = new TableDelegate();

    TextGrid.DocumentView = tableview;
}

以下、結果になります。
結果

  • なぜか矢印部分に「Zero」〜「Nine」までの文字か勝手に入力される
  • 選択箇所の後ろ側?だけ、青く色が変わっている
  • 文字の編集などはできない

今後、回答で頂いたURLを読みながら少しずつ改変していきたいと思います。

何卒よろしくお願いいたします。

 追記(2)

ご回答いただきましたソースを元に、以下を作成いたしました。

  • 表にキーボードから記入できるようになった
  • 表に行を追加することができるようになった

お陰様で、上記二つの問題は解決いたしました。

残る問題は

  • 表に記入されているデータを参照する
  • あらかじめ表にデータを入力しておく(表に入力したデータをテキストファイルか何かに保存し、それを次回に改めて表示することができる)

の二点となりました。
何卒、解決への糸口をご教授いただければと思います。

 現状

解決したソースを掲載させて頂きます。

1.TableViewについてのカスタマイズ(ご回答頂きましたソースのままです)

using System;
using System.Collections.Generic;
using AppKit;

namespace FreeEncodeMailer
{
    public class Product
    {
        #region Computed Propoperties
        public string Title { get; set; } = "";
        public string Description { get; set; } = "";
        #endregion

        #region Constructors
        public Product()
        {
        }

        public Product(string title, string description)
        {
            this.Title = title;
            this.Description = description;
        }
        #endregion
    }



    /// <summary>
    /// TableDataSource
    /// </summary>
    public class ProductTableDataSource : NSTableViewDataSource
    {
        #region Public Variables
        public List<Product> Products = new List<Product>();
        #endregion

        #region Constructors
        public ProductTableDataSource()
        {
        }
        #endregion

        #region Override Methods
        public override nint GetRowCount(NSTableView tableView)
        {
            return Products.Count;
        }
        #endregion
    }



    /// <summary>
    /// ProductTableDelegate
    /// </summary>
    public class ProductTableDelegate : NSTableViewDelegate
    {
        #region Constants 
        private const string CellIdentifier = "ProdCell";
        #endregion

        #region Private Variables
        private ProductTableDataSource DataSource;
        #endregion

        #region Constructors
        public ProductTableDelegate(ProductTableDataSource datasource)
        {
            this.DataSource = datasource;
        }
        #endregion

        #region Override Methods
        public override NSView GetViewForItem(NSTableView tableView, NSTableColumn tableColumn, nint row)
        {
            // This pattern allows you reuse existing views when they are no-longer in use.
            // If the returned view is null, you instance up a new view
            // If a non-null view is returned, you modify it enough to reflect the new data
            NSTextField view = (NSTextField)tableView.MakeView(tableColumn.Title, this);
            if (view == null)
            {
                view = new NSTextField();
                view.Identifier = tableColumn.Title;
                view.BackgroundColor = NSColor.Clear;
                view.Bordered = false;
                view.Selectable = false;
                view.Editable = true;

                view.EditingEnded += (sender, e) => {

                    // Take action based on type
                    switch (view.Identifier)
                    {
                        case "Product":
                            DataSource.Products[(int)view.Tag].Title = view.StringValue;
                            break;
                        case "Details":
                            DataSource.Products[(int)view.Tag].Description = view.StringValue;
                            break;
                    }
                };
            }

            // Tag view
            view.Tag = row;

            // Setup view based on the column selected
            switch (tableColumn.Title)
            {
                case "Product":
                    view.StringValue = DataSource.Products[(int)row].Title;
                    break;
                case "Details":
                    view.StringValue = DataSource.Products[(int)row].Description;
                    break;
            }

            return view;
        }

        public override bool ShouldSelectRow(NSTableView tableView, nint row)
        {
            return true;
        }
        #endregion
    }


}

2.動作を記述する部分への表記

// 画面がロードされた時
public override void ViewDidLoad()
{
        base.ViewDidLoad();

       var DataSource = new ProductTableDataSource();
       // Populate the Product Table
       TableView.DataSource = DataSource;
       TableView.Delegate = new ProductTableDelegate(DataSource);
}

public override NSObject RepresentedObject
{
    get
      {
          return base.RepresentedObject;
      }
      set
      {
          base.RepresentedObject = value;
          // Update the view, if already loaded.
      }
}


// 追加ボタンを押すと入力できる行が追加できるようになりました
partial void ClickButton_NewAddress(NSObject sender)
{
    TableView.BeginUpdates();

    var DataSource = new ProductTableDataSource();
    DataSource = (FreeEncodeMailer.ProductTableDataSource)TableView.DataSource;
    DataSource.Products.Add(new Product("", ""));

    TableView.ReloadData();
    TableView.EndUpdates();   
}

 やりたいこと

  • 表に記入されているデータを参照する
  • あらかじめ表にデータを入力しておくことができる
  • ↑(表に入力したデータをテキストファイルか何かに保存し、それを次回に改めて表示することができる)

表のサンプル画像
上記画像のように、選択されている行の値を参照したいと考えています。
また、上記のように表へあらかじめデータを入力しておき、その続きから改めて行の追加を行いたいと考えています。

まず、
2列目(キーがDetailである列(上記、「現状」のコード参照))を取得しようと、以下のようにコードを書きましたが、結果的に空のStringしか取得できませんでした。

partial void ClickButton_GetValue(NSObject sender)
{
    var DataSource = (FreeEncodeMailer.ProductTableDataSource)TableView.DataSource;
    string address = DataSource.Products[(int)TableView.SelectedRow].Title;
}


→他にもいくつか試したのですが。どれもエラーを吐いてしまい、動作しませんでしたので掲載を省きました。

どうすれば、表の値を参照できるのでしょうか?
また、どうすれば「やりたいこと」を実現できるでしょうか?

度々申し訳ございませんが、ご回答をお待ちしております。
何卒よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

空のデータソースをTableViewに追加しておけば事前に空白の行は用意しておけると思います。

データソースの追加は以下のコードが参考になりそうです。
https://github.com/xamarin/mac-samples/blob/master/MacTables/MacTables/ViewController.cs

https://github.com/xamarin/mac-samples/blob/master/NSOutlineViewAndTableView/NSOutlineViewAndTableView/NSTableViewCode/NSTableViewExample.cs

また、このサンプルはセルの文字列も編集できますのでこの動作も参考になるかと思います。
https://github.com/xamarin/mac-samples/blob/master/MacTables/MacTables/ProductTable/ProductTableDelegate.cs

 追記(1)

断片的な内容のみを提供してしまい申し訳ありません。以下のドキュメントでTableViewの全容が概ね記載されていますのでこちらも参考になるかと思います。アウトレットの追加なども記載されているのでチェックしてみてください。
https://docs.microsoft.com/ja-jp/xamarin/mac/user-interface/table-view

セルの編集などTableViewの動作をデリゲートで設定します。
https://docs.microsoft.com/ja-jp/xamarin/mac/user-interface/table-view#editing-cells

 追記(2)

こちらのコードをベースに
https://docs.microsoft.com/ja-jp/xamarin/mac/user-interface/table-view
ボタンで空白の行を追加するようにしてみました。
https://github.com/ukgraphics/TableViewApp

 追記(3)

表に記入されているデータを参照する

以下のようにあらかじめデータソースにデータを追加しておいて

var DataSource = new ProductTableDataSource();
DataSource.Products.Add(new Product("Xamarin.iOS", "Allows you to develop native iOS Applications in C#"));
DataSource.Products.Add(new Product("Xamarin.Android", "Allows you to develop native Android Applications in C#"));
DataSource.Products.Add(new Product("Xamarin.Mac", "Allows you to develop Mac native Applications in C#"));


「追加2の現状」で調査いただいたようにボタンクリックで以下のように取得できてました。

partial void ClickedGetButton(Foundation.NSObject sender)
{
    var DataSource = new ProductTableDataSource();
    DataSource = (TableViewApp.ProductTableDataSource)TableView1.DataSource;

    var TitleStr = DataSource.Products[(int)TableView1.SelectedRow].Title;
    Console.WriteLine(TitleStr);
}


あらかじめデータソースにデータを追加した場合
行を追加してデータを追加した場合
画像を拝見した限りですとテキストにフォーカスが残っていて編集状態のままのようですので、この状態ですとデータソースにデータとして追加されておらず、空白が返ってくるように思います。

あらかじめ表にデータを入力しておく(表に入力したデータをテキストファイルか何かに保存し、それを次回に改めて表示することができる)

こちらですが、本件が長くなってしまったので新規に別の質問としてアップしてみてはどうでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/14 19:35

    ご回答を有難うございます。
    ご丁寧にURLを貼って頂いたにも関わらず申し訳ございません。
    お恥ずかしい話ではありますが、
    上記URLを読んでも、どこにどうソースを埋め込めばいいのか。アウトレットはどうなっているのか、など・・・。
    かなり初心者の私にはほぼ理解できませんでした。申し訳ございません。

    もし、まだおつきあい願えるようでしたら、
    *追加したデータソースはどう扱えばいいのか。
    *デリゲートの活用法とは?
    をご教授願えればと思います。

    教えて頂きましたソースを元に、少しだけ進展した現状を追記しておきます。
    ご一瞥を頂けますと幸いです。
    (ほとんど進展できず申し訳ございません)

    何卒よろしくお願いいたします。

    キャンセル

  • 2018/03/19 22:51

    ご回答を有難うございます。
    そして、ここまでお付き合い頂きまことに有難うございました。

    キャプチャ画面までつけて頂き、本当に有難うございます。
    しかしなぜかはわからないのですが、データソースにあらかじめデータを入力しておいてもそれが表示されないという事態になってしまっています。
    その件も踏まえ、確かに質問内容から少し離れてきてしまったと思いましたので、改めて質問をあげさせて頂きました。

    https://teratail.com/questions/118174?modal=q-comp

    お付き合い頂けるようでしたら、改めてよろしくお願い申し上げます。
    本当に有難うございました。

    キャンセル

  • 2018/03/20 09:27 編集

    データ値の参照方法ですが、githubのサンプルも更新しておきました。もし未確認でしたらこちらで動作をチェックしてみてください。
    https://github.com/ukgraphics/TableViewApp

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6006questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • MacOS(OSX)

    1702questions

    MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

  • Visual Studio

    1561questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Xamarin

    425questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。